函数题:
6-1 函数求值
求下列函数值:
![](https://img-blog.csdnimg.cn/img_convert/209be82db28e405024aba04c7b485001.jpeg)
输入只有一行,依次为一个正整数n(1 <= n <= 200),和一个浮点数x(0<x<100)。
输出只有一行,为所求得的函数值(保留3位小数)。
提示:C语言中开平方的函数原型为:double sqrt(double); ,可以在代码中使用
注意:此题要求递归求解,且不允许使用全局变量,否则没有分。
函数接口定义:
doublefun( int n , double x );
其中 n 和 x 都是用户传入的参数。 n 大于等于1且小于等于200; x 大于0且小于100。函数须返计算结果。
裁判测试程序样例:
#include<stdio.h>#include<math.h>doublefun( int n , double x );
intmain(){
int n;
double x;
scanf( "%d%lf" , &n , &x );
printf( "%.3f\n" , fun( n , x ) );
return0;
}
/* 请在这里填写答案 */
输入样例:
20 3.3
输出样例:
在这里给出相应的输出。例如:
4.987
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
程序代码:
double fun(int n, double x)
{
if (n == 1)
return sqrt(n + x);
else
return sqrt(n + fun(n - 1, x));
}
编程题:
7-1 身高预测
利用父母的身高可以对孩子成人后的身高进行预测,公式为:
男孩成人时的身高 = ( 父亲身高 + 母亲身高) * 1.08 / 2
女孩成人时的身高 = ( 父亲身高 * 0.923 + 母亲身高)/ 2
这个公式为捷克斯洛伐克人提出的,比较简便,因此流传很广。但因只考虑父母的遗传因素,所以误差范围比较大,使用价值有限。
现请你根据这个公式和给定的数据来预测一下孩子成人后的身高。
输入格式:
只有一行,为两个浮点数,加一个整数,依次代表父亲的身高、母亲的身高和孩子的性别(父母的身高大于0小于3,单位为米;最后一个整数为0时代表女孩,为1时代表男孩;测试数据保证所有输入符合上述要求)。
输出格式:
也只有一行,为根据上述公式预测的孩子的身高(单位仍然为米,要求保留2位小数)。
输入样例:
1.81 1.72 1
输出样例:
1.91
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
程序代码:
#include<stdio.h>
int main()
{
double fu, mu;
int sex;
scanf("%lf %lf %d", &fu, &mu, &sex);
double len;
if (sex == 0)
{
len = (fu * 0.923 + mu) / 2;
}
else
{
len = (fu + mu) * 1.08 / 2;
}
printf("%.2lf\n", len);
return 0;
}
7-2 拍7令四
拍7令是一种多人游戏,参与游戏的人围成一圈,依次快速报数。规则规定,第一个人从任意一个数字开始报数,当有人数到含有“7”的数字或“7”的倍数时,用拍手来代替报数,下个人继续报之后的数。如果有人报错数或拍错手则视为失败。现在请你写一段类似的程序。
输入格式:
为2个用空格分隔的正整数,第一数代表第一人第一次报的数,第二个数代表最后一次报的数(假设这轮游戏期间没有失败的行为出现)。
输出格式:
只有一个整数,该整数为此轮游戏所有没有报出的数个数。
测试数据保证输入合法,且 1、输入的两个数均大于0且小于1000000;2、输入的两个数字均该被报出;3、后一个数字大于前一个数字。
输入样例:
1 22
输出样例:
4
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
程序代码:
#include<stdio.h>
int main()
{
int a1, a2;
scanf("%d %d", &a1, &a2);
int i, j, cnt = 0, flag, ch;
for (i = a1; i <= a2; i++)
{
flag = 0;
ch = i;
while (ch != 0)
{
if (ch % 10 == 7)
{
flag = 1; break;
}
ch = ch / 10;
}
if (i % 7 == 0 || flag == 1)
cnt++;
}
printf("%d\n", cnt);
return 0;
}
7-3 干支纪年法
中国农历采取天干地支作为计算年,月,日,时的方法,就是把每一个天干和地支按照一定的顺序而不重复地搭配起来,用来作为纪年,纪月,纪日,纪时的代号。把“天干”中的一个字摆在前面,后面配上“地支”中的一个字,这样就构成一对干支。如果“天干”以“甲”字开始,“地支”以“子”字开始顺序组合,就可以得到:
1.甲子 2.乙丑 3.丙寅 4.丁卯 5. 戊辰 6.已巳 7.庚午 8.辛未 9.壬申 10.癸酉11. 甲戌 12.乙亥 13.丙子 14.丁丑 15.戊寅 16.已卯 17.庚辰 18.辛巳 19.壬午 20.癸未21.甲申 22.乙酉 23.丙戌 24.丁亥 25.戊子 26.已丑 27.庚寅 28.辛卯 29.壬辰 30.癸巳31.甲午 32.乙未 33.丙申 34.丁酉 35.戊戌 36.已亥 37.庚子 38.辛丑 39.壬寅 40.癸卯41.甲辰 42.乙巳 43.丙午 44.丁未 45.戊申 46.已酉 47.庚戌 48.辛亥 49.壬子 50.癸丑51.甲寅 52.乙卯 53.丙辰 54.丁巳 55.戊午 56.已未 57.庚申 58.辛酉 59.壬戌 60.癸亥
这六十对干支,天干经六个循环,地支经五个循环正好是六十,就叫做“六十干支”。按照这样的顺序每年用一对干支表示,六十年一循环,叫做“六十花甲子”。如2013年是癸巳年,1990是庚午年;从1984年的甲子年,到2044年又是甲子年。这种纪年方法就叫做“干支纪年法”,一直沿用到今天。历史上的辛亥革命、戊戌变法等说法均源于此。
假设我们用0-9依次代替10个天干,A-L依次代替12个地支,现在请你写一段程序,根据给定的年份算出其干支纪年法所对应的年份。
输入格式:
第1 行是测试数据的组数T(0<T<100)。后面跟着T 行测试用例,每行一个正整数n(1000<n<3000),代表公元纪年法的年份。
输出格式:
T行,每行对应一个测试用例,为该年份所对应的干支纪年法的年份(相应的字符表示)。
输入样例:
3
1984
1990
2044
输出样例:
0A
6G
0A
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
程序代码:
#include<stdio.h>
int main()
{
char a[10] = { '0','1','2','3','4','5','6','7','8','9' };
char b[12] = { 'A','B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L' };
int n;
scanf("%d", &n);
int i, j, year;
for (i = 0; i < n; i++)
{
scanf("%d", &year);
if (year >= 1984)
{
printf("%c%c\n", a[(year - 1984) % 10], b[(year - 1984) % 12]);
}
else
printf("%c%c\n", a[10-((1984 - year) % 10)], b[12-((1984 - year) % 12)]);
}
return 0;
}
7-4 奇怪的屏幕
我们的屏幕大都是由一个一个像素点构成的。随着各个像素点亮度,色彩等不同,屏幕上就可以显示各种不同的图案。现在有一个屏幕有些奇怪,当某一个像素点亮了以后,它周边的8个点(当这个点在屏幕的边上或角上时,这个数量是不一样的)都会亮。当然后亮的这8个点是因为这个中心点才亮的,它们不再会导致它们各自周围的点再亮了(否则一个点亮了,整个屏幕就都亮了)。我们把前一种像素点叫主动亮的点。如图所示,如果那个红色的点为主动亮的点,则红框内其他8个点则会因为这个主动亮的点也亮起来,但红框外边的点不会。
![](https://img-blog.csdnimg.cn/img_convert/d41fde4f2b07e9fc5f28c220b8b48152.jpeg)
如果规定屏幕的左上角的坐标为(1,1),它的右边的点坐标依次为(1,2),(1,3)等等,它的下边的点坐标依次为(2,1),(3,1)等等。其他点坐标也依此类推。
现在请你写一段程序来计算一下在某种情况下这个屏幕共亮了多少个像素点。
输入格式:
第一行为三个用空格分隔的整数m,n,c(0<m,n,c<10),依次代表屏幕像素行数,列数以及主动亮的像素点的个数。后边共c行,每行均为两个用空格分隔的整数,依次代表c个主动点亮的点的行坐标和列坐标。
测试用例保证输入合法且没有重复的主动亮的点。
输出格式:
所有亮了的像素点个数(包括主动亮的点)。
输入样例:
4 6 2
2 2
4 2
输出样例:
12
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
程序代码:
#include<stdio.h>
int main()
{
int m, n, c;
scanf("%d %d %d", &m, &n, &c);
int a[10][10] = { 0 };
int i, j, a1, b1;
for (i = 0; i < c; i++)
{
scanf("%d %d", &a1, &b1);
if (a1== 1 && b1 == 1)
{
a[a1][b1] = 1;
a[a1][b1 + 1] = 1;
a[a1+1][b1] = 1;
a[a1+1][b1+1] = 1;
}
else if (a1 == 1 && b1 == n)
{
a[a1][b1] = 1;
a[a1][b1 - 1] = 1;
a[a1 + 1][b1] = 1;
a[a1 + 1][b1 - 1] = 1;
}
if (a1 == m && b1 == 1)
{
a[a1][b1] = 1;
a[a1][b1 + 1] = 1;
a[a1 - 1][b1] = 1;
a[a1 - 1][b1 + 1] = 1;
}
if (a1 == m && b1 == n)
{
a[a1][b1] = 1;
a[a1][b1 - 1] = 1;
a[a1 - 1][b1] = 1;
a[a1 - 1][b1 - 1] = 1;
}
else if (a1 == 1)
{
a[a1][b1] = 1;
a[a1][b1-1] = 1;
a[a1][b1+1] = 1;
a[a1+1][b1] = 1;
a[a1+1][b1-1] = 1;
a[a1+1][b1+1] = 1;
}
else if (b1 == 1)
{
a[a1][b1] = 1;
a[a1-1][b1] = 1;
a[a1-1][b1 + 1] = 1;
a[a1][b1+1] = 1;
a[a1 + 1][b1] = 1;
a[a1 + 1][b1 + 1] = 1;
}
else if (a1 == m)
{
a[a1][b1] = 1;
a[a1][b1 - 1] = 1;
a[a1][b1 + 1] = 1;
a[a1 - 1][b1] = 1;
a[a1 - 1][b1 - 1] = 1;
a[a1 - 1][b1 + 1] = 1;
}
else if (b1 == n)
{
a[a1][b1] = 1;
a[a1][b1 - 1] = 1;
a[a1-1][b1 - 1] = 1;
a[a1 -1][b1] = 1;
a[a1 + 1][b1 - 1] = 1;
a[a1 + 1][b1] = 1;
}
else
{
a[a1][b1] = 1;
a[a1][b1 - 1] = 1;
a[a1][b1 + 1] = 1;
a[a1 - 1][b1] = 1;
a[a1 - 1][b1 - 1] = 1;
a[a1 - 1][b1+1] = 1;
a[a1 + 1][b1] = 1;
a[a1 + 1][b1 - 1] = 1;
a[a1 + 1][b1 + 1] = 1;
}
}
int sum = 0;
for (i = 1; i<= m; i++)
{
for (j = 1; j <= n; j++)
{
if (a[i][j] == 1)
sum++;
}
}
printf("%d\n", sum);
return 0;
}