【奶酪原创】蓝桥杯2011C-本科组预赛答案

it2022-05-19  61

1. 代码填空 (满分3分)

神秘的三位数

有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身。即:abc = a! + b! + c!

下面的程序用于搜索这样的3位数。请补全缺失的代码。

int JC[] = {1,1,2,6,24,120,720,5040,40320,362880};

int i;

for(i=100; i<1000; i++)

{

int sum = 0;

int x = i;

while(____)

{

sum += JC[x];

x /= 10;

}

if(i==sum) printf("%d\n", i);

}

 

//预赛NO.1题#include <stdio.h>void main(){int JC[] = {1,1,2,6,24,120,720,5040,40320,362880};int i;int sum;int x;for (i=100; i<1000; i++) { sum = 0; x = i;while (x) { sum += JC[x%10]; x /= 10; }if (i == sum) { printf("%d\n",i); } }}

2. 代码填空 (满分4分)

歌赛新规则

歌手大赛的评分规则一般是去掉一个最高分,去掉一个最低分,剩下的分数求平均。当评委较少的时候,如果我们只允许去掉一个分数,该如何设计规则呢?

有人提出:应该去掉与其余的分数平均值相差最远的那个分数。即“最离群”的分数。

以下的程序用于实现这个功能。其中x存放所有评分,n表示数组中元素的个数。函数返回最“离群”的那个分数值。请补全缺失的代码。

double score(double x[], int n)

{

int i,j;

double dif = -1;

double bad;

for(i=0; i<n; i++)

{

double sum = 0;

for(j=0; j<n; j++)

{

if(________) sum += x[j];

}

double t = x[i] - sum / (n-1);

if(t<0) t = -t;

if(t>dif)

{

dif = t;

bad = x[i];

printf("%d, %f\n", i, x[i]);

}

}

 

return bad;

}

 

//预赛NO.2题#include <stdio.h>void main(){double x[10] = {7,8,8,8,8,20,8,8,8,8};int i,j;double dif = -1;double bad;double sum;int n=10;double t;for (i=0;i<10;i++) { sum = 0;for (j=0; j<n ; j++) {if (j!=i) sum+=x[j]; } t = x[i]-sum/(n-1);if (t<0) t = -t;if (t>dif) { dif = t; bad = x[i]; printf("%d,%f\n",i,x[i]); } } printf("bad = %lf\n",bad);}

3. 代码填空 (满分4分)

反转串

我们把“cba”称为“abc”的反转串。

下面的代码可以把buf中的字符反转。其中n表示buf中待反转的串的长度。请补充缺少的代码。

void reverse_str(char* buf, int n)

{

if(n<2) return;

char tmp = buf[0];

buf[0] = buf[n-1];

buf[n-1] = tmp;

_______________________________;

}

 

//预赛NO.3题#include <stdio.h>#include <string.h>void reverse_str(char* buf, int n){char tmp;if (n<2) return; tmp = buf[0]; buf[0] = buf[n-1]; buf[n-1] = tmp; reverse_str(buf+1,n-2); }void main(){char a[10] = "zhanghe"; reverse_str(a,strlen(a)); printf("%s\n",a);}

4. 代码填空 (满分5分)

n进制小数

将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出。例如:若十进制小数为0.795,则输出:

十进制正小数 0.795000 转换成 进制数为: 0.11001011

十进制正小数 0.795000 转换成 进制数为: 0.21011011

十进制正小数 0.795000 转换成 进制数为: 0.30232011

十进制正小数 0.795000 转换成 进制数为: 0.34414141

十进制正小数 0.795000 转换成 进制数为: 0.44341530

十进制正小数 0.795000 转换成 进制数为: 0.53645364

十进制正小数 0.795000 转换成 进制数为: 0.62702436

十进制正小数 0.795000 转换成 进制数为: 0.71348853

以下代码提供了这个功能。其中,dTestNo表示待转的十进制小数。iBase表示进制数。请填写缺失的部分。

void fun(double dTestNo, int iBase)

{

int iT[8];

int iNo;

 

printf("十进制正小数 %f 转换成 %d 进制数为: ",dTestNo, iBase);

 

for(iNo=0;iNo<8;iNo++)

{

dTestNo *= iBase;

iT[iNo] = ________________;

if(___________________) dTestNo -= iT[iNo];

}

 

printf("0.");

for(iNo=0; iNo<8; iNo++) printf("%d", iT[iNo]);

printf("\n");

}

 

void main ( )

{

double dTestNo= 0.795;

int iBase;

 

for(iBase=2;iBase<=9;iBase++)

fun(dTestNo,iBase);

printf("\n");

}

//预赛NO.4题#include <stdio.h>void fun(double dTestNo, int iBase){int iT[8];int iNo; printf("十进制正小数 %f 转换成 %d 进制数为:",dTestNo, iBase);for(iNo=0;iNo<8;iNo++) { dTestNo *= iBase; iT[iNo] = (int)dTestNo;if(dTestNo) dTestNo -= iT[iNo]; } printf("0.");for(iNo=0; iNo<8; iNo++) printf("%d", iT[iNo]); printf("\n");}void main ( ){ double dTestNo= 0.795;int iBase;for(iBase=2;iBase<=9;iBase++) fun(dTestNo,iBase); printf("\n");}

 

5. 代码填空 (满分6分)

轮换

串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。这称为对串进行位移=1的轮换。同理,“abcd”变为:“cdab”则称为位移=2的轮换。

下面的代码实现了对串s进行位移为n的轮换。请补全缺失的代码。

void shift(char* s, int n)

{

char* p;

char* q;

int len = strlen(s);

if(len==0) return;

if(n<=0 || n>=len) return;

 

char* s2 = (char*)malloc(_________);

p = s;

q = s2 + n % len;

while(*p)

{

*q++ = *p++;

if(q-s2>=len)

{

*q = ___________;

q = s2;

}

}

strcpy(s,s2);

free(s2);

}

 

//预赛NO.5题#include <stdio.h>#include <string.h>#include <stdlib.h>void shift(char* s, int n){char* p;char* q;int len = strlen(s);char* s2;if(len==0) return;if(n<=0 || n>=len) return; s2= (char*)malloc(sizeof(char)*(len+1)); p = s; q = s2 + n % len;while(*p) { *q++ = *p++;if(q-s2>=len) { *q = '\0'; q = s2; } } strcpy(s,s2); free(s2);}void main(){char str[10] = "zhanghe"; shift(str,2); printf("%s\n",str);}

 

6. 代码填空 (满分9分)

中奖计算

某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。

例如:小张写的数字是:12345678,而开奖号码是:42347856。则称小张中了3个号,因为其中最长的相同连续位是:“234”。如果小张写的是:87654321,则他只中了一个号。

下面的代码根据传入的参数,返回中了几个号。其中:a表示被评价的号码,b表示摇号产生的数字。请填写缺少的代码。

int g(int a, int b)

{

char sa[]="00000000";

char sb[]="00000000";

int n = 0;

int i,j;

 

sprintf(sa,"

转载请注明原文地址: https://win8.8miu.com/read-1494770.html

最新回复(0)