1、最小公倍数
求两个数字的最小公倍数是很常见的运算。比如,3和5的最小公倍是15。6和8的最小公倍数是24。
下面的代码对给定的两个正整数求它的最小公倍数。请填写缺少的代码,使程序尽量高效地运行。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
1 int f(int a, int b) 2 { 3 int i; 4 for(i=a;;______) 5 { 6 if(i%b==0) return i; 7 } 8 }
参考答案:i+=a 或者 i = i + a; 注意:i++ 虽然可以得到正确结果,但不符题意(高效运行),不给分。
2、组合数
从4个人中选2个人参加活动,一共有6种选法。
从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。
请仔细分析代码,填写缺少的部分(下划线部分)。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
1 // n 个元素中任取 m 个元素,有多少种取法 2 int f(int n, int m) 3 { 4 if(m>n) return 0; 5 if(m==0) _______________; 6 7 return f(n-1,m-1) + _____________; 8 }
参考答案:
空1: h(space+1, x-1) (6分) 空2: x-i (3分) (char)((int)x-i) 当然也是可以的 可能有许多写法,代入到源程序,看运行结果。
3、金字塔
下面代码的目标是输出一个大写字母组成的金字塔。
其中space表示金字塔底距离左边的空白长度,x表示金字塔底的中心字母。
比如:space=0, x=’C’,则输出:
A
ABA
ABCBA
再如:space=2,x=’E’, 则输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
请分析该段代码的逻辑,填写缺少的部分。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
1 void h(int space, char x) 2 { 3 int i; 4 if(x<'A' || x>'Z') return; 5 _______________; 6 for(i=0; i<space; i++) printf(" "); 7 for(i=0; i<x-'A'; i++) printf("%c",'A'+i); 8 for(i=0; i<=x-'A'; i++) printf("%c",______); 9 printf("\n"); 10 }
参考答案:
空1: h(space+1, x-1) (6分) 空2: x-i (3分) (char)((int)x-i) 当然也是可以的
4、自守数
如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625
下面代码的目的是寻找出2千万以内的所有自守数。
注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。
请分析代码并填写缺失的部分。
注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。
1 void zishou() 2 { 3 int n; 4 for(n=1; n<20 * 1000 * 1000; n++) 5 { 6 int n2 = n; 7 int m = 0; 8 for(;;) 9 { 10 if(n2==0) 11 { 12 printf("%d\n", n); 13 break; 14 } 15 16 int k = n2 % 10; // 从末尾开始,取出乘数的每位数字 17 m += k * n; // 累计乘积 18 if(_________________) break; 19 m = m / 10; // 舍去累计乘积的末位 20 n2 = _______________; 21 } 22 } 23 }
填空1: m % 10 != k 或者: k = m % 10 m%10-k==0 填空2: n2 / 10
5、中奖计算
某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。
例如:小张写的数字是:12345678,而开奖号码是:42347856。则称小张中了3个号,因为其中最长的相同连续位是:“234”。如果小张写的是:87654321,则他只中了一个号。
下面的代码根据传入的参数,返回中了几个号。其中:a表示被评价的号码,b表示摇号产生的数字。请填写缺少的代码。
把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
1 int g(int a, int b) 2 { 3 char sa[]="00000000"; 4 char sb[]="00000000"; 5 int n = 0; 6 int i,j; 7 8 sprintf(sa,"%8d",a); 9 sprintf(sb,"%8d",b); 10 for(i=0; i<8; i++) 11 { 12 for(j=1; j<=8-i; j++) 13 { 14 char t = ________; 15 sa[i+j] = 0; 16 if(strstr(sb, sa+i)) 17 { 18 if(j>n) _________; 19 } 20 sa[i+j] = t; 21 } 22 } 23 24 return n; 25 }
参考答案: 空1:sa[i+j] (4分) 空2:n = j (5分) 注意,指针与数组形式的等价性。 *(sa+i+j) 是一样的
6、开平方
如果没有计算器,我们如何求2的平方根?
可以先猜测一个数,比如1.5,然后用2除以这个数字。如果我们猜对了,则除法的结果必然与我们猜测的数字相同。我们猜测的越准确,除法的结果与猜测的数字就越接近。
根据这个原理,只要我们每次取猜测数和试除反馈数的中间值作为新的猜测数,肯定更接近答案!这种计算方法叫做“迭代法”。
下面的代码模拟了如何用手工的方法求2的平方根的过程。请填写缺少的代码。
double n = 2; double a = 0; double b = n; while(fabs(a-b)>1E-15) { a = (a+b)/2; b = __________; } printf("%f\n", a);
n/a
7、假设a,b,c是3个互不相等的整数。下列代码取出它们中居中的数值,记录在m中。其中的swap()函数可以交换两个变量的值。请完善代码。
if(a>b) swap(&a, &b); if(b>c) swap(&b, &c); ______________________; int m = b;
参考答案: if(a>b) swap(&a, &b) 注意: a>b 也可写为 b<a swap(&a, &b) 写为:swap(&b, &a) 也是对的。
8、 给定一个串,例如“aabbbcddddkkkmmmmaakkkk”我们希望去掉连续的重复字母,得出串:“abcdkmak”,下面代码实现了该功能,请完善之。
1 char* p = "aabbbcddddkkkmmmmaakkkk"; 2 char buf[100]; 3 4 char* q = p; 5 int i=0; 6 for(;*q;) 7 { 8 if(___________|| *q != *(q-1)) 9 { 10 buf[i++] = *q; 11 } 12 q++; 13 } 14 buf[i] = '\0'; 15 16 printf("%s\n", buf);
参考答案: q==p 这里我觉的填入i==0也是合理的,保证第一次能执行if语句就行