7-1 sdut-C语言实验-众数
众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。
给定一组数,你能求出众数吗?
输入格式:
输入数据有多组(数据组数不超过 50),到 EOF 结束。
对于每组数据:
第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。
输出格式:
对于每组数据,在一行中输出一个整数,表示这组数据的众数。
数据保证有唯一的众数。
输入样例1:
3
1 1 3
输出样例1:
1
输入样例2:
5
0 2 3 1 2
7
12 10 12 34 9 12 8
输出样例2:
2
12
#include<stdio.h>
int main()
{
int m,n,i,k;
while(scanf("%d",&n)!=EOF)
{
int a[1001]={0};
int max=0;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
a[m]++;
}
for(i=0;i<=1000;i++)
{
if(a[i]>max)
{
max=a[i];
k=i;
}
}
printf("%d\n",k);
}
return 0;
}
7-2 sdut-C语言实验-排序问题
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
输入格式:
输入数据有一行,包含10个整数,用空格分开。
输出格式:
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
输入样例:
1 2 3 5 4 6 8 9 10 7
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9
#include<stdio.h>
int main()
{
int i,j,t;
int a[10],b[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
for(i=0;i<10;i++)
{
if(i==9)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
for(i=0;i<10;i++)
{
if(i==9)
printf("%d\n",b[i]);
else
printf("%d ",b[i]);
}
return 0;
}
7-3 sdut-C语言实验- 冒泡排序中数据交换的次数
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
输入格式:
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100
输出格式:
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数
输入样例:
在这里给出一组输入。例如:
3
5 1 2 3 4 5
4 5 3 7 1
2 2 1
输出样例:
在这里给出相应的输出。例如:
0
4
1
#include<stdio.h>
int main()
{
int t,n,j,x;
int a[100];
scanf("%d\n",&t);
for(int i=0;i<t;i++)
{
scanf("%d",&n);
int m=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
if(n==1)
printf("0");
for(int i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
m++;
}
}
}
printf("%d\n",m);
}
return 0;
}
7-4 sdut-C语言实验-矩阵输出(数组移位)
输入N个整数,输出由这些整数组成的n行矩阵。
输入格式:
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。
输出格式:
以输入的整数为基础,输出有规律的N行数据。
输入样例:
在这里给出一组输入。例如:
5
3 6 2 5 8
输出样例:
在这里给出相应的输出。例如:
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3
#include<stdio.h>
int main()
{
int n,t,j;
int a[n];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(j=0;j<n;j++)
{
for(int i=0;i<n;i++)
{
if(i==n-1)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}//先正常输出一行
t=a[n-1];//下一行就要把最后一位数字存起来,把他放到第一位上去
for(int i=n-1;i>0;i--)
{
a[i]=a[i-1];//从倒数第一个开始,每一个都等于前边那位
}
a[0]=t;
}
return 0;
}
7-5 sdut-C语言实验- 数列有序!
有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
输入格式:
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
输出格式:
对于每个测试实例,输出插入新的元素后的数列。
输入样例:
3 3
4 2 1
0 0
输出样例:
在这里给出相应的输出。例如:
4 3 2 1
#include<stdio.h>
int main()
{
int n,i,t,m,j;
int a[101];
while(scanf("%d %d",&n,&m)!=EOF)
{
if(m==0&&n==0)
break;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
a[n]=m;//我们直接把m作为a[n]数组的一个,然后排序就好了
for(i=0;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<=n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
}
return 0;
}
7-6 sdut- C语言实验-数组逆序(数组移位)
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。
输入格式:
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。
输出格式:
按先后顺序输出n个整数。
输入样例:
5 1 2 3 4 5
2
输出样例:
4 5 1 2 3
#include<stdio.h>
int main()
{
int i,j,n,t,m;
int a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=m;i>0;i--)
{
t=a[n-1];
for(j=n-2;j>=0;j--)
{
a[j+1]=a[j];
}
a[0]=t;
}
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
}
7-7 sdut-C语言实验- 排序
给你N(N<=100)个数,请你按照从小到大的顺序输出。
输入格式:
输入数据第一行是一个正整数N,第二行有N个整数。
输出格式:
输出一行,从小到大输出这N个数,中间用空格隔开。
输入样例:
5
1 4 3 2 5
输出样例:
1 2 3 4 5
#include<stdio.h>
int main (){
int a[10],i,j,n,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<=n;i++)//这个其实就是循环n次的意思,就是我们选择排序要经过n步,可以参考一下最后一题
{
for(j=i+1;j<n;j++)//每次循环都把大的放到后面
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
return 0;
}
7-8 简版田忌赛马
单位 绍兴文理学院
这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。
输出格式:
对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。
输入样例:
4
3
92 83 71
95 87 74
2
20 25
21 12
10
1 2 3 24 5 6 7 8 9 12
11 13 15 19 22 34 14 21 44 99
4
10 15 16 37
14 20 30 40
输出样例:
200
400
-1200
0
#include <stdio.h>
int tian[105],qi[105];
int main() {
int t,n,m,i,j;
scanf("%d",&t);
while(t--) {
int sum=0;
scanf("%d",&n);
for(i=0; i<n; i++) {
scanf("%d",&tian[i]);
}
for(i=0; i<n; i++) {
scanf("%d",&qi[i]);
}
for(i=0; i<n-1; i++) {
int k=i;
for(j=i+1; j<n; j++) {
if(tian[k]<tian[j])
k=j;
}
if(k!=i) {
int t=tian[k];
tian[k]=tian[i];
tian[i]=t;
}
}
for(i=0; i<n-1; i++) {
int k=i;
for(j=i+1; j<n; j++) {
if(qi[k]<qi[j])
k=j;
}
if(k!=i) {
int t=qi[k];
qi[k]=qi[i];
qi[i]=t;
}
}
i=0;
j=n-1;
int k=0;
int cnt=0;
while(i<=j) {
if(tian[i]>qi[k]) {
++cnt;
++i;
} else if(tian[i]==qi[k]) {
if(tian[j]>qi[n-1]) {
++i;
} else {
--cnt;
--j;
}
} else {
--cnt;
--j;
}
++k;
}
printf("%d\n",cnt*200);
}
return 0;
}
7-9 sdut- C语言实验---最值
有一个长度为n的整数序列,其中最小值和最大值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。
输入格式:
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。
输出格式:
输出转换好的序列。数据之间用空格隔开。
输入样例:
6
2 3 8 1 4 5
输出样例:
1 3 5 2 4 8
#include<stdio.h>
int a[10];
int main()
{
int n,i,t1,t2;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int min=0,max=0;
for(i=0;i<n;i++)
{
if(a[i]>a[max])
{
max=i;
}
if(a[i]<a[min])
{
min=i;
}
}
t1=a[0];
a[0]=a[min];
a[min]=t1;
t2=a[n-1];
a[n-1]=a[max];
a[max]=t2;
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
return 0;
}
7-10 sdut-C语言实验-整数位
输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。
输入格式:
输入一个不多于5位的正整数。
输出格式:
输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。
输入样例:
123
输出样例:
3
1 2 3
3 2 1
#include<stdio.h>
int main()
{
int n,i,x=1,y,m;
int a[5];
scanf("%d",&n);
for(i=4;i>=0;i--)
{
a[i]=n%10;
n=n/10;
}//因为它是一个不多于5位的整数
for(i=0;i<5;i++)
{
if(a[i]!=0)//就比如123这个数,它弄出来的数组就前两位就是0
{
break;//只要它不为零了,我们就break
}
}
m=i;//然后我们把i标记下来
printf("%d\n",5-m);//因为不为零的那儿的位置已经执行了,所以其实是等于2,按说前两位为零应该是a[0]和a[1],所以就不用4-i,而是5-i
for(i=m;i<5;i++)
{
if(i==4)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
for(i=4;i>=m;i--)
{
if(i==m)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
return 0;
}
7-11 sdut-C语言实验-区间之和
给定一个由 n 个整数组成的序列A1,A2,......, An 和两个整数L,R,你的任务是写一个程序来计算序列号在L,R 这段位置区间内所有数的总和。
输入格式:
输入只有一组测试数据:
测试数据的第一行为一个整数 n (1< n < 10000);
第二行为 n 个 int 类型的整数;
第三行为两个整数 L,R(0 < L < R <= n)。
输出格式:
输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。
输入样例:
5
3 5 6 2 9
2 4
输出样例:
13
#include<stdio.h>
int main()
{
int i,n,l,r,sum=0;
int a[10000];
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d %d",&l,&r);
for(i=l-1;i<=r-1;i++)
{
sum=sum+a[i];
}
printf("%d",sum);
return 0;
}
7-12 选择法排序之第k趟
本题要求使用选择法排序,将给定的n个整数从小到大进行排序,输出第k趟(k从0开始)排序后的结果。
选择排序的算法步骤如下:
第0步:在未排序的n个数(a[0]〜 a[n−1])中找到最小数,将它与 a[0]交换;
第1步:在剩下未排序的n−1个数(a[1] 〜 a[n−1])中找到最小数,将它与 a[1] 交换;
......
第k步:在剩下未排序的n−k个数(a[k]〜a[n−1])中找到最小数,将它与 a[k] 交换;
......
第n−2步:在剩下未排序的2个数(a[n−2] 〜a[n−1])中找到最小数,将它与 a[n−2]交换。
输入格式:
输入第一行给出一个不超过10的正整数n和一个不超过n-1的正整数k。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出排序过程中第k步(k从0开始)的中间结果,即第k步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4 1
5 1 7 2
输出样例:
1 2 7 5
#include<stdio.h>
int main (){
int a[10],i,j,n,t,k;
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<=k;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
return 0;
}