2011 模拟 c语言 本科(国信蓝点样题)
注意:
本套模拟题主要模拟命题形式与考核范围。真实竞赛题的数量、难度可能与此套模拟题有差异。
说明:
本试卷包含两种题型:“代码填空”与“程序设计”。
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不多于一条语句(即不能出现分号)。
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。
1. 代码填空(满分2分)
下列代码,把一个2位整数交换十位与个位的位置。请填写缺失的代码。
例如:当x=95时,返回59。
int switch_num(int x)
{
int a = x / 10;
int b = x % 10;
return _______;
}
#include<stdio.h>
#include<stdlib.h>
int switch_num(int x)
{
int a = x / 10;
int b = x % 10;
return b*10+a;
}
void main()
{
int switch_num(int);
int i;
scanf("%d",&i);
i=switch_num(i);
//system("cls");
printf("\n%d\n",i);
system("pause");
}
2. 代码填空(满分3分)
下列代码把一个二进制的串转换为整数。请填写缺少的语句;
char* p = "1010110001100";
int n = 0;
for(int i=0;i<strlen(p); i++)
{
n = __________________;
}
printf("%d\n", n);
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
//int i;
char*p = "1010110001100";
int n = 0;
//printf("%d\n\n\n",strlen(p));
for(inti=0;i<(int)strlen(p); i++)
{//Math.Pow(底数,指数);
//printf("\n\n%d\n",n);
n=n+((int)(*(p+i)-48)*((int)pow(2,(int)strlen(p)-1-i)));
//printf("%c\n",*(p+i));
}
puts(p);
// i=(int)pow(2,5);
printf("\n\n%d\n",n);
printf("%d\n",(int)(*p));
system("pause");
return0;
}
3. 代码填空(满分3分)
假设a,b,c是3个互不相等的整数。下列代码取出它们中居中的数值,记录在m中。其中的swap()函数可以交换两个变量的值。请完善代码。
if(a>b) swap(&a, &b);
if(b>c) swap(&b, &c);
______________________;
int m = b;
int i;
if(a>b) swap(&a, &b);
if(b>c) swap(&b,&c);
if(b<a)swap(&b, &a);
int m = b;
4. 代码填空(满分5分)
计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return _______________________;
}
5. 代码填空(满分6分)
此段代码的意图是把一个缓冲区中的整数重新排列,使得所有负数都在正数的左边。请分析其工作流程,补充缺失的代码。
void reorder(int*pData, int len)
{
if(pData == NULL || len == 0) return;
int *pBegin = pData;
int *pEnd = ____________;
while(pBegin < pEnd)
{
if(*pBegin<0)
{
pBegin ++;
__________;
}
if(*pEnd>=0)
{
pEnd --;
___________;
}
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
int main(int argc, char**argv)
{
int a[] = {1,2,3,-5,-4,5,9,-8,-1};
reorder(a, 9);
for(int i=0; i<9; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
6. 代码填空(满分9分)
给定一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。例如:给定字符串“xyz”,则程序输出:
xyz
xzy
yxz
yzx
zyx
zxy
试完善程序中空缺的部分。
void f(char *str, intlen, int n)
{
int i;
char tmp;
char *p = (char *)malloc(__________);
if(n==len-1){
printf("%s\n",str);
}else{
for(i=n;i<len;i++){
strcpy(p,str);
tmp = *(str+n);
*(str+n) = *(str+i);
*(str+i) = tmp;
_______________;
strcpy(str,p);
}
}
free(p);
}
int main(int argc, char**argv)
{
char str[] = "xyz";
f(str,3,0);
printf("\n");
return 0;
}
7. 代码设计(满分5分)
625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。
输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:
625
8. 代码设计(满分11分)
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
9. 代码设计(满分18分)
整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1,2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
10.代码设计(满分20分)
一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。
程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。