资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
温故而知新,下笔如有神。近些年程序员考试专项测练及答案试题一阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。【说明】如果一个自然数N恰好等于它所有不同的真因子(即N的约数以及1,但不包括N)之和S,则称该数为“完美数”。例如6123,28124714,所以6和28都是完美数。显然,6是第1个(即最小的)完美数。下面流程图的功能是求500以内所有的完美数。【流程图】循环开始框中要注明:循环变量初始值,终值,步长,步长为1时可以缺省。如果某自然数小于其所有真因子之和(例如2412346812),则称该自然数为亏数:如果某自然数大于其所有真因子之和(例如8124),则称该自然数为贏数如果某自然数等于从1开始的若干个连续自然数之和(例如101234)则称该自然数为三角形数数。据此定义,自然数496是( )。供选择答案:(1)A.亏数 B.赢数 C.完美数,非三角形数 D.完美数和三角形数【答案】(1)2(2)N%K(3)S+K(4)S(5)D 【解析】 流程图的功能是求500以内所有的完美数,N的值范围是6500,因此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(i1)插入有序子序列17,得到17,392;第2次:将68(i2)插入有序子序列17,392,得到17,68,392;第3次:将36(i3)插入有序子序列17,68,392,得到17,36,68,392,完成排序。下面函数 insertSort用直接插入排序对整数序列进行升序排列,在main函数中调用insertSort并输出排序结果。 【C代码】void insert Sort(int data,int n)/*用直接插入排序法将data0 datan-1中的n个整数进行升序排列*/ int i,j; int tmp; for(i=1; i=0 & dataj 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(;bpep; bp+) /按升序输出数组元素 printf(%dt,(5)); return 0;【答案】(1)datai-1(2)dataj+1=dataj(3)dataj+1(4)arr(5)*bp【解析】 直接插入排序法是将关键码插入已经排好的序列中,因此将datai插入序列data0datai-1中,此时序列data0datai-1已经按照升序排列好,而datai应插入位置前的数据应该比datai小,而插入位置后的数据应比datai大,在if语句中判断datai=datai-1,则将datai插入到di-1后;若datai=0&datajtmp;j-)循环,从datai-2开始向前逐一比较,即j从i-2开始向0循环,若datajtmp,则进行for循环,此时需要将dataj即datai-2的值后移,使得datai-1=datai-2,即dataj+1=dataj,然后j-,用tmp与dataj进行比较,如果tmp dataj,则说明tmp应放在dataj之前,那么dataj需要继续往后移动。所以dataj+1= dataj。 当该循环结束时,此时有2种情况:(1)j=-1tmp;应使得data0后移,即data1=data0,data0=tmp,因此第3空填写dataj+1;(2)dataj=tmp;此时需要将tmp插入到dataj后,即dataj+1=tmp。在main函数中调用insertSort函数并输出数组元素,在for(; bpep;bp+)中循环变量是bp,因此输出的是bp指向的数组元素,即调用insertSort函数后返回的数组arr,因此bp=arr(bp是指针变量,数组名arr可以直接将数组地址传递给bp);在printf函数中输出bp;因此printf(“%dn”,*bp)。试题三阅读以下C代码,回答问题1至问题3,将解答填入答题纸的对应栏内。【C代码1】float adjustSalary(int service_year,int age,float salary) if( service_year 30 ) salary *= 1.2; else salary *= 2.0; return salary;【C代码2】void foo(int coin) switch (coin) case 1: printf(Centn); case 5: printf(Nicke1n);break; case 10: printf(Dimen); case 25: printf(Quartern); 【C代码3】int getSum(int n)int t, i = 0, sum = 0;while ( i n ) scanf(%d, &t); if( t0 ) 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,因此再判断age5,因此直接进行else中的运算,salary=7000.0*2.0=14000.0,由于salary为float类型数据,因此输出为14000.000000。 对于x3,service_year=5,age=41,salary=5000.0,首先判断service_year30,进行运算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(“Centn”),输出Cent并回车,继续执行printf(“Nickeln”),输出Nickel并回车,再执行break,结束foo函数。foo(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号