【说明】 已知某数列的前两项为2和3,其后继项根据当前最后两项的乘积按下列规则生成: (1)若乘积为一位数,则该乘积即为数列的后继项; (2)若乘积为二位数,则该乘积的十位数和个位数依次作为数列的两个后继项。 本程序输出该数列的前n项以及它们的和。其中,函数sum(n,pa)返回数列的前n项之和,并将生成的前n项存放于首指针为pa的数组中。程序中规定输入的n值必须大于2并且不超过给定的常数值MAXNUM。 例如:若输入n值为10,则程序输出如下内容: sum(10)=44 2 3 6 1 8 8 6 4 2 4 #include<stdio.h> #define MAXNUM 100 int sum(int n,int *pa){ int count,total,temp; *pa=2; (1) =3; total=5; count=2; while(count++<n){ temp+=*(pa-1)**pa; if(temp<10){ total+=temp; *(++pa)=temp; } else{ (2) =temp/10; total+=*pa; if(count<n){ count++;pa++; (3) =temp%10; total+=*pa; } } } (4) ; } main(){ int n,*p,*q,num[MAXNUM]; do{ printf("Input N=(2<N<%d):",MAXNUM+1); scanf("%d",&n); }while( (5) ); printf("\nsum(%d)=%d\n",n,sum(n,num)); for(p=num,q= (6) ;p<q;p++)printf("%4d",*p); printf("\n"); }
参考答案:
解析:(1)*++pa (2)*++pa (3)*pa (4)return(total) (5)n<3||n>MAXNUM (6)p+n
[分析]: 本题考查用C语言对数列的操作。 通过程序说明部分的描述及实例,可以清楚地了解程序功能。由于真正的处理函数是sum(),而主函数只是输入数据,调用sum(),以及输出结果,所以我们可以先分析sum()。 int sum(im n,int*pa){ int cotmt,total,temp; *pa=2; (1) =3; 程序说明部分已经提到数列的前两个元素为2和3。*pa存储了第一个元素“2”,很显然“3”应存在*(pa+1)中。又因为后面有语句“temp+=*(pa-1)**pa;”,这说明在求乘积时,pa是指向要运算数的后者,例如要求2*3,pa指向3,用*(pa-1)表示2。所以(1)空应填*(++pa),而不能用*(pa+1)。 total=5;count=2; while(count++<n){ temp+=*(pa-1)**pa; 这里是求两数列元素的乘积。 if(temp<10){ total+=temp; *(++pa)=temp; } else{ (2) =temp/10; 对应程序说明,当乘积小于10时,直接把乘积作为数列的后继项;当乘积大于等于10时,把该乘积的十位数字和个位数字依次作为数列的两个后继项。这时应当把大于等于10的数(因为最大的数为9*9=81,所以都为两位数)分解为单个的数字,“temp/10”求出的是十位数字,所以存入当前数列元素的后继项,即(2)空应填*(++pa)。 total+=*pa; 统计当前数列和。 if(count<n){ 如果当前数列元素个数没有达到指定值n,则把乘积的个位数(temp%10)作为数列的后继项;如果当前数列元素个数已经达到指定值n,则可以退出循环,返回主函数了。 count++;pa++; (3) =temp%10; 由于前面已经有“pa++”,所以(3)空应填*pa。 total+=*pa; } } } (4) ; } 又因为主函数有“printf("\nsum(%d)=%d\n",n,sum(n,num,));”,说明函数sum()返回了数列和。因此,(4)空应填return(total)。 当分析完函数sum()的功能后,我们再来看main(),就显得十分简单了。 do{ printf("Input N=(2<N<%d):",MAXNUM+1); scanf("%d",&n); }while( (5) ); 上面是输入n的值,n要保证是合法值才能继续下面的工作,所以当输入n不合法时,应重新输入n值。因此,(5)空应填n<3||n>MAXNUM。 printf("\nsum(%d)=%d\n",n,sum(n,num)); for(p=num,q= (6) ;p<q;p++)printf("%4d",*p); 此for循环用于输出数列,循环终止条件是“p<q”,又因为num是数列首指针且n为数列长度,所以(6)空应填p+n。