2018 上半年程序员考试真题及答案-下午卷
试题一
阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
如果一个自然数 N 恰好等于它所有不同的真因子(即 N 的约数以及 1,但不包括 N)之
和 S,则称该数为“完美数”。例如 6=1+2+3,28=1+2+4+7+14,所以 6 和 28 都是完
美数。显然,6 是第 1 个(即最小的)完美数。
下面流程图的功能是求 500 以内所有的完美数。
【流程图】
循环开始框中要注明:循环变量=初始值,终值[,步长],步长为 1 时可以缺省。
如果某自然数小于其所有真因子之和(例如 24<1+2+3+4+6+8+12),则称该自然
数为亏数:如果某自然数大于其所有真因子之和(例如 8>1+2+4),则称该自然数为贏数
如果某自然数等于从 1 开始的若干个连续自然数之和(例如 10=1+2+3+4)则称该自然
数为三角形数数。据此定义,自然数 496 是( )。
供选择答案:
(1)A.亏数
B.赢数
C.完美数,非三角形数
D.完美数和三角形数
【答案】
(1)2
(2)N%K
(3)S+K
(4)S
(5)D
【解析】
流程图的功能是求 500 以内所有的完美数,N 的值范围是 6~500,因此 N 是需要判断是
否为完美数,首先需要求出 N 的所有真因子,然后再判断 N 和真因子之和是否相等,从流程
图可以看出 S 是保存真因子和的变量,K 是保存真因子的变量,因此 K 的初始值是 2,终值
是 N/2,因此第(1)空处填写:2;判断 K 是否为 N 的真因子,即判断 N%K(N 除以 K 取余)
是否为 0,第(2)空填写:N%K;当 K 为 N 的真因子时,需要计算所有 K 的和,即 S=S+K,
第(3)空填写:S+K;最后判断 N 和 S 是否相等,第(4)空填写:S。
496 的真因子有:1、2、4、8、16、31、62、124、248,1+2+4+8+16+31+62+124+248=496;
因此 496 是完美数,同时 496=(1+2+3+4+……+30+31),因此 496 是完美数和三角形数。
试题二
阅读以下说明和 C 代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。
【说明】
直接插入排序是一种简单的排序方法,具体做法是:在插入第 i 个关键码时,k1,k2,…,
ki-1 已经排好序,这时将关键码 ki 依次与关键码 ki-1,ki-2,…,进行比较,找到 ki 应
该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入 ki。
例如,对{17,392,68,36}按升序作直接插入排序时,过程如下:
第 1 次:将 392(i=1)插入有序子序列{17},得到{17,392};
第 2 次:将 68(i=2)插入有序子序列{17,392},得到{17,68,392};
第 3 次:将 36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排
序。
下面函数 insertSort 用直接插入排序对整数序列进行升序排列,在 main 函数中调用
insertSort 并输出排序结果。
【C 代码】
void insert Sort(int data[],int n)
/*用直接插入排序法将 data[0]~ data[n-1]中的 n 个整数进行升序排列*/
{
int i,j; int tmp;
for(i=1; i=0 && data[j] > tmp;j)
//查找插入位置并将元素后移
(2);
(3)=tmp;
}/*if*/
}/*for*/
//插入正确位置
}/*insertSort*/
int main()
{
int *bp,*ep;
int n,arr[]={17,392,68,36,291,776,843,255};
n = sizeof(arr) / sizeof(int);
insertSort(arr,n);
bp=(4); ep = arr+n;
for(;bp=data[i-1],则将 data[i]插入到 d[i-1]
后;若 data[i]=0&&data[j]>tmp;j--)循环,从 data[i-2]开始向前逐一比较,即 j
从 i-2 开始向 0 循环,若 data[j]>tmp,则进行 for 循环,此时需要将 data[j]即 data[i-2]
的值后移,使得 data[i-1]=data[i-2],即 data[j+1]=data[j],然后 j--,用 tmp 与 data[j]
进行比较,如果 tmp< data[j],则说明 tmp 应放在 data[j]之前,那么 data[j]需要继续往
后移动。所以 data[j+1]= data[j]。
当该循环结束时,此时有 2 种情况:(1)j=-1<0,此时 data[0]>tmp;应使得 data[0]
后移,即 data[1]=data[0],data[0]=tmp,因此第 3 空填写 data[j+1];(2)data[j]<=tmp;
此时需要将 tmp 插入到 data[j]后,即 data[j+1]=tmp。
在 main 函数中调用 insertSort 函数并输出数组元素,在 for(; bp
试题三
阅读以下 C 代码,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【C 代码 1】
float adjustSalary(int service_year,int age,float salary) {
if( service_year <=5 ) {
if( age > 30 )
salary *= 1.2;
}
else
salary *= 2.0;
return salary;
}
【C 代码 2】
void foo(int coin) {
switch (coin) {
case 1:
printf("Cent\n");
case 5:
printf("Nicke1\n");break;
case 10:
printf("Dime\n");
case 25:
printf("Quarter\n");
}
}
【C 代码 3】
int getSum(int n)
{
int t, i = 0, sum = 0;
while ( i < n ) {
scanf("%d", &t);
if( t<0 )
continue;
sum += t;
i++;
}
return sum;
}
【问题 1】(3 分)
对于【C 代码 1】,写出下面的函数调用后 x1、x2 和 x3 的值。
x1 = adjustSalary(1,25,9000.0);
x2 = adjustSalary(8,32,7000.0);
x3 = adjustSalary(5,41,5000.0);
【问题 2】(6 分)
(1)写出函数调用为 foo(1)的输出结果;
(2)写出函数调用为 foo(5)的输出结果;
(3)写出函数调用为 foo(10)的输出结果;
(4)写出函数调用为 foo(25)的输出结果。
【问题 3】(6 分)
(1)简要说明【C 代码 3】中的函数 getSum()的功能;
(2)程序员小王将函数 getSum 改写后得到下面的函数 getSum_v2(即用 for 语句来描
述循环)。请问,getSum_v2 的功能是否与【C 代码 3】的 getSum 完全相同,若不同,请说
明原因。
答案:
【问题 1】
(1)x1=9000.000000
(2)x2=14000.000000
(3)x3=6000.000000
【解析】
对于 x1,service_year=1,age=25,salary=9000.0,首先判断 service_year<=5,因
此再判断 age<30,不进行任何运算,salary 仍为 9000.0,由于 salary 为 float 类型数据,
因此输出为 9000.000000。
对于 x2,service_year=8,age=32,salary=7000.0,首先判断 service_year>5,因此
直接进行 else 中的运算,salary=7000.0*2.0=14000.0,由于 salary 为 float 类型数据,
因此输出为 14000.000000。
对于 x3,service_year=5,age=41,salary=5000.0,首先判断 service_year<=5,因
此再判断 age>30,进行运算 salary=5000.0*1.2=6000.0,由于 salary 为 float 类型数据,
因此输出为 6000.000000。
【问题 2】
(1)foo(1):Cent
Nickel
(2)foo(5):Nickel
(3)foo(10):Dime
Quarter
(4)foo(25):Quarter
【解析】
foo(1) : coin=1 , 执 行 printf( “ Cent\n ” ) , 输 出 Cent 并 回 车 , 继 续 执 行
printf(“Nickel\n”),输出 Nickel 并回车,再执行 break,结束 foo 函数。
foo(5):coin=5,执行 printf(“Nickel\n”),输出 Nickel 并回车,再执行 break,
结束 foo 函数。
foo(10) : coin=10 , 执 行 printf( “ Dime\n ” ) , 输 出 Dime 并 回 车 , 继 续 执 行
printf(“Quarter\n”),输出 Quarter 并回车,结束 foo 函数。
Foo(25):coin=25,执行 printf(“Quarter\n”),输出 Quarter 并回车,结束 foo 函
数。
【问题 3】