由于这些代码也是我初学时写的代码,故其中的规范程度及简洁程度并不很好(此处我后来写的有可以参考一下->C语言代码规范),但是能很好的接近出初学者的水平,也更有参考价值!排版不易,喜欢就点个赞吧!如有问题,请勿吐槽,欢迎留言互相学习。
第8周编程题在线测试
1. 摘苹果
题目内容:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度(已知在100cm到200cm之间,包括100cm和200cm),以及陶陶把手伸直时能达到的最大高度(已知在100cm到120cm之间,包括100cm和120cm),请你编写程序帮助陶陶计算一下他能摘到的苹果数目。假设他碰到苹果,苹果就会掉下来。
函数原型:int GetApple(int a[], int height, int n);
函数功能:计算淘淘能摘到的苹果数目
函数参数:数组a保存苹果到地面的高度;height代表陶陶把手伸直时能达到的最大高度;n为苹果数
函数返回值:淘淘能摘到的苹果数目
程序运行示例1:
100 200 150 140 129 134 167 198 200 111↙
110↙
5
程序运行示例2:
120 110 200 134 122 162 183 144 128 100↙
105↙
6
输入格式: “%d”
注意(第一行输入的数据是10个苹果分别到地面的高度;第二行输入的数据是陶陶把手伸直时能达到的最大高度)
输出格式:"%d"
代码实现
#include <stdio.h>
#include <stdlib.h>
int GetApple(int a[], int height, int n);
int main()
{
int a[100],b,c,n;
for(c=0;c<10;c++)
{
scanf("%d",&a[c]);
}
scanf("%d",&b);
printf("%d",GetApple(a,b,n));
return 0;
}
int GetApple(int a[], int height, int n)
{
int c;
for(c=0,n=0;c<10;c++)
{
if(a[c]<=30+height)
{
n=n+1;
}
}
return n;
}
2. 好数对
题目内容:
已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。
注:集合中最多有1000个元素,元素最大不超过10000
程序运行示例1:
4↙
1 2 3 4↙
2
程序运行示例2:
7↙
2456 3251 654 890 100 754 1234↙
1
输入格式:"%d"
第一行:输入集合A的元素个数
第二行:输入A的各个元素,用空格隔开
输出格式:"%d"
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b[1000],c,d,e,s,sum=0,n=0;
scanf("%d",&a);
for(c=0;c<a;c++)
{
scanf("%d",&b[c]);
}
for(d=0;d<a-1;d++)
{
for(e=d+1;e<a;e++)
{
sum=b[d]+b[e];
for(s=0;s<a;s++)
{
if(sum==b[s])
{
n+=1;
}
}
}
}
printf("%d",n);
return 0;
}
3. 组合三位数
题目内容:
将0到9这十个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。
输入格式: 无
输出格式:"%d,%d,%d\n" (注意:输出的顺序为第一个3位数,第二个3位数,第三个3位数)
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include<stdio.h>
int main()
{
int a1,a2,a3,b1,b2,b3,c1,c2,c3,a,b,c;
for( a=100;a<333;a++)
{
b=a*2;
c=a*3;
a1=a/100;
a2=(a-100*a1)/10;
a3=a%10;
b1=b/100;
b2=(b-100*b1)/10;
b3=b%10;
c1=c/100;
c2=(c-100*c1)/10;
c3=c%10;
if(a1-a2&&a1-a3&&a1-b1&&a1-b2&&a1-b3&&a1-c1&&a1-c2&&a1-c3
&&a2-a3&&a2-b1&&a2-b2&&a2-b3&&a2-c1&&a2-c2&&a2-c3
&&a3-b1&&a3-b2&&a3-b3&&a3-c1&&a3-c2&&a3-c3
&&b1-b2&&b1-b3&&b1-c1&&b1-c2&&b1-c3
&&b2-b3&&b2-c1&&b2-c2&&b2-c3
&&b3-c1&&b3-c2&&b3-c3
&&c1-c2&&c1-c3)
printf("%d,%d,%d\n",a,b,c);
}
}
4. 求100以内的最大素数
题目内容:
编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。
程序运行示例1:
Input n(n<=500): 10↙
7 5 3 2
sum=17
程序运行示例2:
Input n(n<=500): 100↙
97 89 83 79 73 71 67 61 59 53
sum=732
输入提示信息:“Input n(n<=500):”
输入格式: “%d”
10个最大素数的输出格式:"%6d"
10个最大素数和的输出格式:"\nsum=%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include <stdio.h>
int isprim(int x)
{
int n=1,i=2;
while(n!=0 )
{
n=x%i;
i++;
if(i>=x)
{
return 1;
break;
}
}
if(i<=x)
return 0;
}
int main( )
{
int n,sum=0,count=0;
printf("Input n(n<=500):");
scanf("%d",&n);
for(n;n>0;n--)
{
if(isprim(n)&&n!=1)
{
printf("%6d",n);
sum+=n;
count++;
}
if(count>9)
break;
}
printf("\nsum=%d\n",sum);
return 0;
}
练兵区——编程题
1. 三天打渔两天晒网
题目内容:
中国有句俗语叫“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”,即工作三天,然后再休息两天。问这个人在以后的某一天中是在工作还是在休息。从键盘任意输入一天,编程判断他是在工作还是在休息,如果是在工作,则输出:He is working,如果是在休息,则输出:He is having a rest,如果输入的年份小于1990或者输入的月份和日期不合法,则输出:Invalid input。
输入格式: “%4d-%2d-%2d”
输出格式:
“Invalid input” 或
“He is having a rest” 或
“He is working”
输入样例1:
2014-12-22
输出样例1:
He is working
输入样例2:
2014-12-24
输出样例2:
He is having a rest
输入样例3:
2014-12-32
输出样例3:
Invalid input
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,y,r,a,d=0,ds=0,dds=0,q;
a=scanf("%4d-%2d-%2d",&n,&y,&r);
if(a!=3 || n<1990 || y<1 || y>12 || r>31 || r<1)
{
printf("Invalid input");
goto END;
}
else
{
switch (y)
{
case 1:
dds=0;
break;
case 2:
dds=31;
break;
case 3:
dds=59;
break;
case 4:
dds=90;
break;
case 5:
dds=120;
break;
case 6:
dds=151;
break;
case 7:
dds=181;
break;
case 8:
dds=212;
break;
case 9:
dds=243;
break;
case 10:
dds=273;
break;
case 11:
dds=304;
break;
case 12:
dds=334;
break;
}
if(((n%4==0 && n%100!=0) || (n%100==0 && n%400==0))&&(y>2))
dds+=1;
for(q=1990;q<n;q++)
{
if((q%4==0 && q%100!=0) || (q%100==0 && q%400==0))
d+=1;
}
ds=365*(n-1990)+d+dds+r;
}
if(ds%5==1 || ds%5==2 || ds%5==3)
printf("He is working");
else
printf("He is having a rest");
END: ;
return 0;
}
2. 统计用户输入
题目内容:
从键盘读取用户输入直到遇到#字符,编写程序统计读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。(要求用getchar()输入字符)
程序运行结果示例1:
Please input a string end by #:
abc def↙
jklm op↙
zkm #↙
space: 3,newline: 2,others: 15
程序运行结果示例2:
Please input a string end by #:
hello friend!#↙
space: 1,newline: 0,others: 12
输入提示信息:“Please input a string end by #:\n”
输入格式: getchar()
输出格式: “space: %d,newline: %d,others: %d\n”
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=0,b=0,c=0;
char s;
printf("Please input a string end by #:\n");
while((s=getchar())!='#')
{
if(s==' ')
a++;
else if(s=='\n')
b++;
else
c++;
}
printf( "space: %d,newline: %d,others: %d\n",a,b,c);
return 0;
}
3. 统计正整数中指定数字的个数
题目内容:
从键盘输入一个正整数number,求其中含有指定数字digit的个数。例如:从键盘输入正整数number=1222,若digit=2,则1223中含有 3个2,要求用函数实现。函数原型为:int CountDigit(int number,int digit);
程序运行结果示例1:
Input m,n:
1222,2↙
3
程序运行结果示例2:
Input m,n:
1234,6↙
0
输入提示信息:“Input m,n:\n”
输入格式: “%d,%d”
输出格式: “%d\n”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include <stdio.h>
#include <stdlib.h>
int CountDigit(int number,int digit);
int main()
{
int m,n;
printf("Input m,n:\n");
scanf( "%d,%d",&m,&n);
printf("%d\n",CountDigit(m,n));
return 0;
}
int CountDigit(int number,int digit)
{
int s=0;
for(;number>0;number/=10)
{
if(number%10==digit)
s++;
}
return s;
}
4. 玫瑰花数
题目内容:
如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。
输入格式:无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,d,n;
for(n=1000;n<10000;n++)
{
a=n%10;
b=n/10%10;
c=n/100%10;
d=n/1000%10;
if(pow(a,4)+pow(b,4)+pow(c,4)+pow(d,4)==n)
{
printf("%d\n",n);
}
}
return 0;
}
5. 四位反序数
题目内容:
反序数就是将整数的数字倒过来形成的整数。例如,1234的反序数是4321。设N是一个四位数,它的9倍恰好是其反序数,编程计算并输出N的值。
输入格式: 无
输出格式:"%d\n"
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,a,b,c,d,s;
for(n=1000;n<10000;n++)
{
a=n%10;
b=n/10%10;
c=n/100%10;
d=n/1000%10;
s=a*1000+b*100+c*10+d;
if(s==n*9)
{
printf("%d\n",n);
}
}
return 0;
}
6. 8除不尽的自然数
题目内容:
一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求满足以上条件的最小自然数。
输入格式: 无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include<stdio.h>
int main()
{
int i,a1,a2,a3,b1,b2;
for(i=0;;i++)
{
a1=i/8;
a2=a1/8;
if(i%8==1 && a2%8==7 && a1%8==1)
a3=a2/8;
b1=i/17;
b2=b1/17;
if(i%17==4 && b1%17==15 && b2==a3*2)
{
printf("%d\n",i);
break;
}
}
return 0;
}
7. 矩阵转置v1.0
题目内容:
用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。
程序运行结果示例1:
Input n: 3↙
Input 3 3 matrix:
1 2 3↙
4 5 6↙
7 8 9↙
The transposed matrix is:
1 4 7
2 5 8
3 6 9
程序运行结果示例2:
Input n:2↙
Input 22 matrix:
1 2↙
4 5↙
The transposed matrix is:
1 4
2 5
输入提示信息:
提示输入矩阵的阶数:“Input n:”
提示输入矩阵数据:“Input %d*%d matrix:\n”
输入格式: “%d”
输出提示信息:“The transposed matrix is:\n”
输出格式:"%4d"
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b[100][100],c,d,e,f;
printf("Input n:");
scanf("%d",&a);
printf("Input %d*%d matrix:\n",a,a);
for(c=0;c<a;c++)
for(d=0;d<a;d++)
{scanf("%d",&b[c][d]);}
printf("The transposed matrix is:\n");
for(e=0;e<a;e++)
{for(f=0;f<a;f++)
{printf("%4d",b[f][e]);}
printf("\n");}
return 0;
}
8. 兔子生崽问题
题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。
参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:
(1)每月小兔对数 = 上个月成兔对数。
(2)每月成兔对数 = 上个月成兔对数 + 上个月小兔对数。
综合(1)和(2)有:每月成兔对数 = 前两个月成兔对数之和。
用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:
程序运行示例:
Input n(n<=12):
10↙
1 2 3 5 8 13 21 34 55 89
Total=89
输入提示:“Input n(n<=12):\n”
输入格式:"%d"
输出格式:
每个月兔子对数的输出格式: “%4d”
第12个月的兔子总数的输出格式: “\nTotal=%d\n”
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n=0,a=1,b=1,c=0,i=0;
printf("Input n(n<=12):\n");
scanf("%d",&n);
printf("%4d",1);
for (i = 0; i < n - 1;i++)
{
c = a + b;
a = b;
b = c;
printf("%4d", c);
}
printf( "\nTotal=%d\n",c);
return 0;
}
9. 抓交通肇事犯
题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[ 提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数
k = 1000 i + 100i + 10 j + j
式中,i和j都在0~9变化。此外,还应使k=mm,m是整数。由于k是一个4位数,所以m值不可能小于31。
输入格式: 无
输出格式:“k=%d,m=%d\n”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
代码实现
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b,c,d,e;
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
d=1000*b + 100*b + 10*c + c;
for(e=31;e<100;e++)
{
if(e*e==d&&b!=c)
{
printf("k=%d,m=%d\n",d,e);
}
}
}
}
return 0;
}
10. 检验并打印幻方矩阵
题目内容:
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。
输入格式: “%d”
输出格式:
如果是幻方矩阵,输出提示信息: “It is a magic square!\n”
矩阵元素的输出: “%4d”(换行使用"\n")
如果不是幻方矩阵,输出提示信息: “It is not a magic square!\n”
输入样例1:
17_24_1_8_15
23_5_7_14_16
4_6_13_20_22
10_12_19_21_3
11_18_25_2_9
(输人样例中“ ”代表空格)
输出样例1:
It is a magic square!
17241815
23571416
46132022
10121921*3
111825***2**9
(输出样例中“”代表空格)
输入样例2:
1_0_1_6_1
3_1_1_1_1
1_1_1_1_2
1_1_1_1_1
9_1_7_1_1
(输人样例中“”代表空格)
输出样例2:
It is not a magic square!
(输人样例中“_”代表空格,输出样例中“*”代表空格)
代码实现
#include<stdio.h>
int main()
{
int a[4][5],b[12],c,d,e,f,y,u;
for(c=0;c<=4;c++)
{
for(d=0;d<=4;d++)
{
scanf("%d",&a[c][d]);
}
}
b[0]=a[0][0]+a[0][1]+a[0][2]+a[0][3]+a[0][4];
b[1]=a[1][0]+a[1][1]+a[1][2]+a[1][3]+a[1][4];
b[2]=a[2][0]+a[2][1]+a[2][2]+a[2][3]+a[2][4];
b[3]=a[3][0]+a[3][1]+a[3][2]+a[3][3]+a[3][4];
b[4]=a[4][0]+a[4][1]+a[4][2]+a[4][3]+a[4][4];
b[5]=a[0][0]+a[1][0]+a[2][0]+a[3][0]+a[4][0];
b[6]=a[0][1]+a[1][1]+a[2][1]+a[3][1]+a[4][1];
b[7]=a[0][2]+a[1][2]+a[2][2]+a[3][2]+a[4][2];
b[8]=a[0][3]+a[1][3]+a[2][3]+a[3][3]+a[4][3];
b[9]=a[0][4]+a[1][4]+a[2][4]+a[3][4]+a[4][4];
b[10]=a[0][0]+a[1][1]+a[2][2]+a[3][3]+a[4][4];
b[11]=a[0][4]+a[1][3]+a[2][2]+a[3][1]+a[4][0];
for(y=0;y<12;y++)
{
for(u=y+1;u<12;u++)
{
if(b[y]!=b[u])
{printf("It is not a magic square!\n");
goto END;}
}
}
printf("It is a magic square!\n");
for(e=0;e<=4;e++)
{
for(f=0;f<=4;f++)
{
printf("%4d",a[e][f]);
}
printf("\n");
}
END: ;
return 0;
}
如有问题,欢迎留言~~ 排版不易,喜欢的请点赞分享啊!!