文档介绍:2010年春二级 C语言上机试卷(试卷代号C04) 答案
一、改错题(16分)
【程序功能】
由一个取值在0~32767范围内的正整数x生成一个由十六进制数字字符组成的字符串。生成规则如下:设x的质因数分解式为qnr(n)´qn-1r(n-1)´......´q2r(2)´q1r(1),其中q1代表质数2,q2代表q1之后的下一个质数3,…,qn代表qn-1之后的下一个质数。取出x的质因数分解式中所有质数的指数,将这些指数分别转换为十六进制数字字符并合并为一个字符串。
例如,49的质因数分解式为72´50´30´20,因此由49生成的字符串是“2000”。16384的质因数分解式为214=2E,因此由16384生成的字符串是“E”。
【测试数据与运行结果】
第一次运行输入:49
输出:2000
第二次运行输入:16384
输出:E
第三次运行输入:16000
输出:307
【含有错误的源程序】
#include <>
int nextPrime(int x)
{ int k;
do
{ x++;
for(k=2;k<x;k++)
if(x%k=0)break; /*语法错,易,改为 if(x%k==0)break; */
} while(k<x);
return x;
}
void transform(int x,char *s)
{ int i,j; char *p=s,ch;
char bit[ ]= "0123456789ABCDEF";
for(i=2,j=0;x>2; )
/*算法错,难,改为 for(i=2,j=0;x>=2; ) 或for(i=2,j=0;x>1; ) */
if(x%i==0){ j++; x/=i; }
else { *s++=bit[j]; i=nextPrime(i); j=0; }
*s=bit[j];
*s+1='\0'; /*语法错,中,改为*(s+1)= '\0'; */
for( ;p<s;p++,s--) { ch=*p; *p=*s; *s=ch; }
}
void main( )
{ int a; char s[]; /*语法错,易,改为 int a; char s[80]; */
scanf("%d",&a);
transform(a,s);
puts(s);
getch();
}
二、编程题(24分)
【程序功能】
分别找出3、4位数中的所有Armstrong数并输出。
Armstrong数是指:一个n位数的各位数字的n次方之和等于该数。例如:153=13+53+33;1634=14+64+34+44。因此,153是3位Armstrong数,1634是4位Armstrong数。
【编程要求】
arms(int ar[])实现以下功能:将所有3、4位Armstrong数存入数组ar中,函数返回这些Armstrong数的个数。
:声明1个一维数组a,用a数组作实参调用arms函数,。最后将考生本人的准考证号输出到文