第八周 练兵区编程题
1、三天打渔两天晒网(4分)
题目内容:
中国有句俗语叫“三天打鱼两天晒网”,某人从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
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
#include
int main()
{
int year,month,date,a=0,b,c=0,e;
int sum1,sum2,d;
scanf("%4d-%2d-%2d",&year,&month,&date);
if(year<1990 || month<1 || month>12 || date<1 || date>31)
{
printf("Invalid input");
}
else
{
for(b=1990;b
2、统计用户输入(4分)
题目内容:
从键盘读取用户输入直到遇到#字符,编写程序统计读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。(要求用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”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
int main()
{
char c;
int space=0, newline=0, others=0;
printf("Please input a string end by #:\n");
while((c = getchar()) != '#')
{
if (c == ' ')
{
space++;
}
else if (c == '\n')
{
newline++;
}
else
{
others++;
}
}
printf("space: %d,newline: %d,others: %d\n", space, newline, others);
return 0;
}
3、统计正整数中指定数字的个数(4分)
题目内容:
从键盘输入一个正整数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”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
int CountDigit(int number,int digit);
int main()
{
int m, n;
int count;
printf("Input m,n:\n");
scanf("%d,%d", &m, &n);
count = CountDigit(m,n);
printf("%d\n", count);
return 0;
}
int CountDigit(int number,int digit)
{
int b, i, count=0;
b = number;
for(i=0;b!=0;i++)
{
if((b%10)== digit)
{
count++;
}
b = b / 10;
}
return count;
}
4、玫瑰花数(4分)
题目内容:
如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。
输入格式:无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
#include
int main()
{
int n, a, b, c, d;
for(n=1000;n<=9999;n++)
{
a = n / 1000;
b = n / 100 % 10;
c = n / 10 % 10;
d = n % 10;
if (pow(a,4) + pow(b,4) + pow(c,4) + pow(d,4) == n)
{
printf("%d\n", n);
}
}
return 0;
}
5、四位反序数(4分)
题目内容:
反序数就是将整数的数字倒过来形成的整数。例如,1234的反序数是4321。设N是一个四位数,它的9倍恰好是其反序数,编程计算并输出N的值。
输入格式: 无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
#include
int main()
{
int n, a[4], b[4], m, i;
for(n=1000;9*n<=9999;n++)
{
m = n;
for(i=3;i>=0;i--)
{
a[i] = m % 10;
m = m / 10;
}
m = 9*n;
for(i=3;i>=0;i--)
{
b[i] = m % 10;
m = m / 10;
}
if(a[0]==b[3] && a[1]==b[2] && a[2]==b[1] && a[3]==b[0])
{
printf("%d\n", n);
}
}
return 0;
}
6、8除不尽的自然数(4分)
题目内容:
一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求满足以上条件的最小自然数。
输入格式: 无
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
int main()
{
int n;
int a, b;
for(n=1;;n++)
{
if(n%8==1 && (n-1)/8%8==1 && ((n-1)/8-1)/8%8==7)
{
a = (((n-1)/8-1)/8-7)/8;
if(n%17==4 && (n-4)/17%17==15)
{
b = ((n-4)/17-15)/17;
}
}
if(b == 2 * a)
{
printf("%d\n", n);
break;
}
}
return 0;
}
7、矩阵转置v1.0(4分)
题目内容:
用二维数组作为函数参数,编程计算并输出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 2*2 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"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
#define N 10
void readnumber(int a[N][N],int n);
void changenumber(int a[N][N],int n);
int main()
{
int a[N][N],n;
printf("Input n:");
scanf( "%d",&n);
printf("Input %d*%d matrix:\n",n,n);
readnumber(a,n);
printf("The transposed matrix is:\n");
changenumber(a,n);
return 0;
}
void readnumber(int a[N][N],int n)
{
int i,j;
for(i=0;i
8、兔子生崽问题(4分)
题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,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”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
int F(int a);
int main()
{
int i, n, sum = 0;
printf("Input n(n<=12):\n");
scanf("%d", &n);
for(i=1;i<=n;i++)
{
sum = F(i);
printf("%4d", sum);
}
printf("\nTotal=%d\n", sum);
return 0;
}
int F(int a)
{
if(a == 1)
{
return 1;
}
else if(a == 2)
{
return 2;
}
else
{
return (F(a-1) + F(a-2));
}
}
9、抓交通肇事犯(4分)
题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数
k = 1000i + 100i + 10*j + j
式中,i和j都在0~9变化。此外,还应使k=m*m,m是整数。由于k是一个4位数,所以m值不可能小于31。
输入格式: 无
输出格式:“k=%d,m=%d\n”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
C语言实现:
#include
int main()
{
int m, k, i, j;
for(m=32;m<=99;m++)
{
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
k = 1000*i + 100*i + 10*j + j;
if(m*m == k)
{
printf("k=%d,m=%d\n", k, m);
break;
}
}
}
}
return 0;
}
10、检验并打印幻方矩阵(4分)
题目内容:
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个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!
1724***1*815
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!
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输人样例中“_”代表空格,输出样例中“*”代表空格)
时间限制:500ms内存限制:32000kb
C语言实现:
#include
#include
int main()
{
int i, r, find=1;
int a[5][5], d[2], h[5], l[5];
memset(d, 0, sizeof(int) * 2);
memset(h, 0, sizeof(int) * 5);
memset(l, 0, sizeof(int) * 5);
for(i=0;i<5;i++)
{
for(r=0;r<5;r++)
{
scanf("%d", &a[i][r]);
}
getchar();
}
//幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。
for(i=0;i<5;i++)
{
for(r=0;r<5;r++)
{
if(i == r)
{
d[0] = d[0] + a[i][r];
}
if(i + r == 4)
{
d[1] = d[1] + a[i][r];
}
h[i] = h[i] + a[i][r];
l[r] = l[r] + a[i][r];
}
}
for(i=0;i<5;i++)
{
for(r=0;r<5;r++)
{
if(d[0]==d[1] && d[1]==l[r] && l[r]==h[i])
{
;
}
else
{
find = 0;
}
}
}
if(find)
{
printf("It is a magic square!\n");
for(i=0;i<5;i++)
{
for(r=0;r<5;r++)
{
printf("%4d", a[i][r]);
}
printf("\n");
}
}
else
{
printf("It is not a magic square!\n");
}
return 0;
}