90
题目:
下列给定程序中,函数fun的功能是:计算n的5次方的值(规定n的值大于2、小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。例如,7的5次方是16807,其低3位数的和值是15。
请改正modi.c程序函数fun中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
int fun(int n ,int *value)
{
int d,s,i;
d=0;
s=1;
for(i=1; i<=5; i++)
d=d*n;
*value=d;
for(i=1; i<=3; i++)
{
s=s+d%10;
s=s/10;
}
return s;
}
main( )
{
int n, sum, v;
do
{
printf("\nEnter n(2
scanf("%d",&n);
}
while(n<=2 || n>=8);
sum=fun(n,&v);
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
90
分析:
题目要求在fun函数中计算n的5次方的值(规定n的值大于2、小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和作为函数值返回。例如,7的5次方是16807,其低3位数的和值是15。
程序第一处改错处将d=0;修改为d=1;的原因是d变量用于累乘n,最终保存n的5次方的值,所以初始化为1。如果d初始化为0,则d=d*n;语句不管执行多少次,d的值都是0。
程序第二处改错处将s=1;修改为s=0;的原因是s变量用于累加n的5次方值的个位、十位、百位上数字之和,所以初始化为0。如果s初始化为1,则执行s=s+d%10;语句进行累加的一开始s的值就多了一,所以不对。
程序第三处改错处将s=s/10;修改为d=d/10;的原因是该语句的目的是将n的5次方的值,即d变量的值通过整除10将d变量的当前值的最低位丢弃,准备再次循环取得新值的最低位进行累加。而存放n的5次方的值是d而不是s变量。另外从s=s+d%10;语句可以看出d经过丢弃最低位之后使用取模运算(%)取得d的最低位进行累加。
程序注解如下:
#include
#include
int fun(int n ,int *value)
{
int
d,s,i;
d=1;
s=0;
for(i=1;
i<=5; i++)
d=d*n;
*value=d;
for(i=1;
i<=3; i++)
{
s=s+d%10;
d=d/10;
}
return
s;
}
main( )
{
int n,
sum, v;
do
{
printf("\nEnter n(2
scanf("%d",&n);
}
while(n<=2 || n>=8);
sum=fun(n,&v);
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}