A - C语言实验——最值
Description
有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。
Input
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。
Output
输出转换好的序列。数据之间用空格隔开。
Sample
Input
6
2 3 8 1 4 5
Output
1 3 5 2 4 8
#include<stdio.h>
int main()
{
int n,i,a[10],zd,zx,t,zd1,zx1;
scanf("%d\n",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
if (i==0)
{
zd=a[i];zd1=i;
zx=a[i];zx1=i;
}
if (a[i]>zd)
{
zd=a[i];zd1=i;
}
if (a[i]<zx)
{
zx=a[i];zx1=i;
}
}
t=a[zd1];a[zd1]=a[n-1];a[n-1]=t;
t=a[zx1];a[zx1]=a[0];a[0]=t;
for (i=0;i<=n-1;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
return 0;
}
B - C语言实验——整数位
Description
输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。
Input
输入一个不多于5位的正整数。
Output
输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。
Sample
Input
123
Output
3
1 2 3
3 2 1
#include<stdio.h>
int main()
{
long n;
int i,b,a[5];
scanf("%ld",&n);
i=0;
while (n!=0)
{
a[i]=n%10;
n=n/10;
i=i+1;
}
printf("%d\n",i);
for (b=i-1;b>=0;b--)
{
if (b==i-1) printf("%d",a[b]);
else printf(" %d",a[b]);
}
printf("\n");
for (b=0;b<=i-1;b++)
{
if (b==0) printf("%d",a[b]);
else printf(" %d",a[b]);
}
return 0;
}
C - 小鑫数数儿
Description
某天小鑫忽然得到了许多的数字,他很好学,老师给他布置了一个任务,求出这些数字中,小于他们平均数、等于他们平均数、大于他们平均数的数字的数量是多少。(对于出现的平均数,保证都是整数,不会出现浮点数)
Input
多组输入。
对于每次的输入,第一行一个整数N(1 <= N <= 10),代表数字的个数。
接下来的一行,输入N个整数M(0 <= M <= 100)。
Output
输出包含三个数,第一个跟第二个数后面是空格,最后一个数后面是换行。
第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。
Sample
Input
3
1 2 3
5
2 4 4 5 5
Output
1 1 1
1 2 2
#include<stdio.h>
int main()
{
int i,n,a[10],he,xiao,deng,da;
double pj;
while (scanf("%d",&n)!=EOF)
{
he=0;xiao=0;deng=0;da=0;
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
he=he+a[i];
}
pj=he/n;
for (i=0;i<=n-1;i++)
{
if (a[i]<pj) xiao=xiao+1;
else if (a[i]==pj) deng=deng+1;
else da=da+1;
}
printf("%d %d %d\n",xiao,deng,da);
}
return 0;
}
D - 区间之和
Description
给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在[L,R] (这是一个闭区间) 这段位置区间内所有数的总和。
Input
输入只有一组测试数据:
测试数据的第一行为一个整数 n (1< n < 10000);
第二行为 n 个 int 类型的整数;
第三行为两个整数 L,R(0 < L < R <= n)。
Output
输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。
Sample
Input
5
3 5 6 2 9
2 4
Output
13
#include<stdio.h>
int main()
{
int i,n,s,a[10000],l,r;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
scanf("%d %d",&l,&r);
s=0;
for (i=0;i<=n-1;i++)
{
if ((i>=l-1)&&(i<=r-1))
{
s=s+a[i];
}
}
printf("%d",s);
return 0;
}
E - C语言实验——分割整数
Description
从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。
Input
正整数n,不含前导零。
Output
分割的整数序列,各整数之间用空格格开。
注意,最后一个数字后面没有空格!
Sample
Input
678123
Output
6 7 8 1 2 3
#include<stdio.h>
int main()
{
long n;
int a[10],i,i1;
scanf("%ld",&n);
i=0;
while (n!=0)
{
a[i]=n%10;
n=n/10;
i=i+1;
}
for (i1=i-1;i1>=0;i1--)
{
if (i1==i-1) printf("%d",a[i1]);
else printf (" %d",a[i1]);
}
return 0;
}
F - 众数
Description
众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。
给定一组数,你能求出众数吗?
Input
输入数据有多组(数据组数不超过 50),到 EOF 结束。
对于每组数据:
第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。
Output
对于每组数据,在一行中输出一个整数,表示这组数据的众数。
数据保证有唯一的众数。
Sample
Input
3
1 1 3
5
0 2 3 1 2
Output
1
2
#include<stdio.h>
int main()
{
int a[10000],n,i,b[1001],d=0,s=0;
while (scanf("%d",&n)!=EOF)
{
d=0;s=0;
for (i=0;i<=1000;i++)
{
b[i]=0;
}
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
b[a[i]]+=1;
}
for (i=0;i<=1000;i++)
{
if (b[i]>d)
{
d=b[i];
s=i;
}
}
printf("%d\n",s);
}
return 0;
}
G - 小鑫爱运动
Description
小鑫非常喜欢运动,有一次小鑫去参加110米栏的比赛,一共有10名比赛选手,小鑫是1号,由于跑的太专注,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他?
Input
多组输入。
先输入一个10,
然后每组输入10个整数,代表10个选手的110米栏成绩m,代表1号到N号的N个选手的成绩m,m范围是(0 < m < 100)。
Output
输出只有一行,代表小鑫最后的名次是多少。
因为小鑫长得丑,成绩相同时,他总是排在前面。
Sample
Input
10
2 5 3 9 7 10 23 12 43 5
10
6 1 7 9 3 4 8 3 2 9
Output
1
6
#include<stdio.h>
int main()
{
int a[10],n,i,mc;
while (scanf("%d",&n)!=EOF)
{
mc=1;
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=1;i<=n-1;i++)
{
if (a[0]>a[i]) mc+=1;
}
printf("%d\n",mc);
}
return 0;
}
H - C语言实验——数日子
Description
光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC_。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?
Input
输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。
Output
输出所输入的日期是这一年的第几天。
Sample
Input
2
2009 1 1
2008 1 3
Output
1
3
#include<stdio.h>
int main()
{
int i,a[12],year,yue,ri,n,i1,day;
scanf("%d",&n);
for (i=0;i<=12-1;i++)
{
if (i==3||i==5||i==8||i==10) a[i]=30;
else if (i==1) a[i]=28;
else a[i]=31;
}
for (i=1;i<=n;i++)
{
scanf("%d %d %d",&year,&yue,&ri);
if (yue==1) printf("%d\n",ri);
else if (yue==2) printf("%d\n",31+ri);
else
{
day=0;
for (i1=0;i1<=yue-2;i1++)
{
day=day+a[i1];
}
day=day+ri;
if (((year%4==0)&&(year%100!=0))||(year%400==0)) day=day+1;
printf("%d\n",day);
}
}
return 0;
}
I - 喵帕斯之平地摔
Description
平地摔可是莲酱的特技!莲酱在平地都可以跌倒,更不用说陡峭的地方了。
这里简化一下地面为一维数轴,a[i] 代表第 i 个位置的高度为 a[i]。
对于 a[i - 1] < a[i] > a[i + 1] 的地方被称为绊脚石,会让莲酱跌倒,注意第一个位置和最后一个位置不会成为绊脚石。
现在莲酱想知道他从 1 位置走到 n 位置至少要跌到多少次。
Input
多组输入直到EOF。(组数小于100)
对于每组数据,首先输入一行包含一个正整数 n 。(1 <= n <= 100)
接下来一行包含 n 个正整数 a[i]。(1 <= a[i] <= 100)
Output
对于每组数据输出一行,包含一个整数为莲酱要跌倒的次数。
Sample
Input
9
1 7 8 2 9 3 9 9 3
Output
2
Hint
输入的示例中,第三个位置 8 和第五个位置 9 是绊脚石,总共两个绊脚石。
#include<stdio.h>
int main()
{
int a[100],n,i,cs;
while (scanf("%d",&n)!=EOF)
{
for (i=0;i<=99;i++)
{
a[i]=0;
}
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
cs=0;
for (i=1;i<=n-2;i++)
{
if ((a[i-1]<a[i])&&(a[i]>a[i+1])) cs+=1;
}
printf("%d\n",cs);
}
}
J - 排序
Description
给你N(N<=100)个数,请你按照从小到大的顺序输出。
Input
输入数据第一行是一个正整数N,第二行有N个整数。
Output
输出一行,从小到大输出这N个数,中间用空格隔开。
Sample
Input
5
1 4 3 2 5
Output
1 2 3 4 5
#include<stdio.h>
int main()
{
int a[100],n,i,t,i1;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<n-2;i++)
{
for (i1=0;i1<n-i-1;i1++)
{
if (a[i1]>a[i1+1])
{
t=a[i1];a[i1]=a[i1+1];a[i1+1]=t;
}
}
}
for (i=0;i<=n-1;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
return 0;
}
K - 排序问题
Description
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
Input
输入数据有一行,包含10个整数,用空格分开。
Output
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
Sample
Input
1 2 3 5 4 6 8 9 10 7
Output
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,a[10],b[10],js=1,k,t,j,zj;
for (i=0;i<=9;i++)
{
scanf("%d",&a[i]);
b[i]=js;
js+=1;
}
for (i=0;i<=8;i++)
{
zj=a[i];
k=i;
for (j=i+1;j<=9;j++)
{
if (zj>a[j])
{
zj=a[j];
k=j;
}
}
if (k!=i)
{
t=a[i];a[i]=a[k];a[k]=t;
t=b[i];b[i]=b[k];b[k]=t;
}
}
for (i=0;i<=9;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("\n");
for (i=0;i<=9;i++)
{
if (i==0) printf("%d",b[i]);
else printf(" %d",b[i]);
}
return 0;
}
L - 数列有序!
Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
Sample
Input
3 3
1 2 4
0 0
Output
1 2 3 4
#include<stdio.h>
int main()
{
int a[100],m,n,i,j;
while (scanf("%d %d",&n,&m)!=EOF)
{
if ((m==0)&&(n==0)) break;
else
{
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<=n-1;i++)
{
if (m<=a[i])
{
for (j=n;j>i;j--)
{
a[j]=a[j-1];
}
a[i]=m;
break;
}
else if (m>=a[n-1]) a[n]=m;
}
for (i=0;i<=n;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("\n");
}
}
return 0;
}
M - 中位数
Description
中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如:1, 5, 3 排序后为 1, 3, 5,则其中位数为 3。特别地,当数的个数 N 为偶数时,中位数取位置居中的两个数 (N/2 和 N/2+1) 的平均值,例如:1, 2, 3, 4,中位数为 (2+3)/2 = 2.5。
给定一组数,你能求出中位数吗?
Input
输入数据有多组(数据组数不超过 100),到 EOF 结束。
对于每组数据:
第 1 行输入一个整数 n (3 <= n <= 100),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数,保证互不重复。
Output
对于每组数据,在一行中输出一个实数(保留 1 位小数),表示这组数据的中位数。
Sample
Input
3
1 5 3
4
1 2 3 4
Output
3.0
2.5
#include<stdio.h>
int main()
{
int n,a[100],i,j,t,d;
double ss;
while (scanf("%d",&n)!=EOF)
{
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<=n-2;i++)
{
for (j=0;j<=n-2-i;j++)
{
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
if (n%2==0)
{
d=n/2;
ss=(a[d]+a[d-1])/2.0;
printf("%.1lf\n",ss);
}
else
{
ss=a[n/2];
printf("%.1lf\n",ss);
}
}
return 0;
}
N - C语言实验——各位数字之和排序
Description
给定n个正整数,根据各位数字之和从小到大进行排序。
Input
输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10
Output
输出每组排序的结果。
Sample
Input
3 230 59 110
5 199 220 108 235 120
0
Output
110 230 59
120 220 108 235 199
#include<stdio.h>
int main()
{
int n,a[10],i,b[10],gj,d,j,t;
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
for (i=0;i<=n-1;i++)
{
b[i]=0;
}
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
gj=a[i];
while (gj!=0)
{
d=gj%10;
b[i]=b[i]+d;
gj=gj/10;
}
}
for (i=0;i<=n-2;i++)
{
for (j=0;j<=n-2-i;j++)
{
if (b[j]>b[j+1])
{
t=b[j];b[j]=b[j+1];b[j+1]=t;
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
for (i=0;i<=n-1;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}
O - 期末考试之排名次
Description
期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为IT人,你当然不能用笨笨的人工方法了,编程解决才是好办法。
共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。
Input
第一行一个整数N(N<=100),代表学生的人数。
接下来的N行数据,每行有三个整数,C,M,E分别代表一个学生语文、数学和英语的成绩。
Output
一共N行,每行一个数,从大到小,分别代表各个学生的总成绩。
Sample
Input
3
70 80 90
59 59 59
100 100 100
Output
300
240
177
#include<stdio.h>
int main()
{
int n,a[100]={0},i,j,c,m,e,t;
while (scanf("%d",&n)!=EOF)
{
for (i=0;i<=n-1;i++)
{
scanf("%d %d %d",&c,&m,&e);
a[i]=c+m+e;
}
for (i=0;i<=n-2;i++)
{
for (j=0;j<=n-2-i;j++)
{
if (a[j]<a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
for (i=0;i<=n-1;i++)
{
if (i<n-1) printf("%d\n",a[i]);
else printf("%d",a[i]);
}
}
return 0;
}
P - 次大和次小
Description
对于一个数组,次大的数指数组中第二大的数,相似地,次小的数指数组中第二小的数。
给定一个含有 n 个数的数组(数组中的数互不相同),求其中次大的数和次小的数。
Input
首先输入一个整数 T (1 <= T <= 200),表示数据组数。
对于每组数据:
第 1 行输入一个整数 n (2 <= n <= 1000),表示数组中元素的数量。
第 2 行输入 n 个用空格隔开的整数 Ai (-10000 <= Ai <= 10000),表示数组中每一个元素的值。
Output
对于每组数据,输出一行,包含 2 个整数 a, b,分别表示次大和次小的数。
Sample
Input
1
5
3 1 2 4 5
Output
4 2
#include<stdio.h>
int main()
{
int n,i,i1,j,a[1000],n1,t;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&n1);
for (i1=0;i1<=n1-1;i1++)
{
scanf("%d",&a[i1]);
}
for (i1=0;i1<=n1-2;i1++)
{
for (j=0;j<=n1-2-i1;j++)
{
if (a[j]<a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
if (i<=n-2) printf("%d %d\n",a[1],a[n1-2]);
else printf("%d %d",a[1],a[n1-2]);
}
return 0;
}
Q - 冒泡排序中数据交换的次数
Description
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
Input
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100
Output
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数。
Sample
Input
3
5 1 2 3 4 5
4 5 3 7 1
2 2 1
Output
0
4
1
#include<stdio.h>
int main()
{
int t,n,a[100],i,i1,j,jh,js;
scanf("%d",&t);
for (i1=0;i1<=t-1;i1++)
{
js=0;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<=n-1;i++)
{
for (j=0;j<=n-2-i;j++)
{
if (a[j]>a[j+1])
{
jh=a[j];a[j]=a[j+1];a[j+1]=jh;
js=js+1;
}
}
}
if (i1<t-1) printf("%d\n",js);
else printf("%d",js);
}
return 0;
}
R - 小金追呀追不上妹子
Description
众所周知,C语言的学习是我们程序设计基础的重点和主要内容。
小金知道他喜欢的妹子最喜欢的水果是苹果,但是小金是种玉米的哪!所以他为了讨好妹子的欢心,他会从收获的n个玉米中挑选出m个最大的玉米去抠脚大汉那里换苹果,问题是,他这m个玉米的价值有多大?
Input
多组输入。
每行开始输入两个整数分别为n,m。代表含义如题目所述。
接下来一行有n个整数,代表每个玉米的价值。
1 < = m < n < = 1000
Output
输出小金m个最大玉米的总价值。
输出占一行,保证数据合法。
Sample
Input
10 4
1 2 3 4 5 6 7 8 9 10
5 3
1 2 3 4 5
Output
34
12
#include<stdio.h>
int main()
{
int m,n,a[1000],i,j,t,he;
while (scanf("%d %d",&n,&m)!=EOF)
{
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<=n-2;i++)
{
for (j=0;j<=n-2-i;j++)
{
if (a[j]<a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
he=0;
for (i=0;i<=m-1;i++)
{
he=he+a[i];
}
printf("%d\n",he);
}
return 0;
}
S - C语言实验——数组逆序
Description
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。
Input
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。
Output
按先后顺序输出n个整数。
Sample
Input
5 1 2 3 4 5
2
Output
4 5 1 2 3
#include<stdio.h>
int main()
{
int m,n,a[100],i,j,t;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
while (m--)
{
t=a[n-1];
for (j=n-1;j>=1;j--)
{
a[j]=a[j-1];
}
a[0]=t;
}
for (i=0;i<=n-1;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
return 0;
}
T - 矩阵输出
Description
输入n个整数,输出由这些整数组成的n行矩阵。
Input
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。
Output
以输入的整数为基础,输出有规律的n行数据。
Sample
Input
5
3 6 2 5 8
Output
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 m,n,a[20],i,j,t;
scanf("%d",&n);
for (i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<=n-1;i++)
{
if (i==0) printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("\n");
m=n-1;
while (m--)
{
t=a[n-1];
for (j=n-1;j>=1;j--)
{
a[j]=a[j-1];
}
a[0]=t;
for (j=0;j<=n-1;j++)
{
if (j==0) printf("%d",a[j]);
else printf(" %d",a[j]);
}
if (m>=1) printf("\n");
}
return 0;
}