c语言编程求纠错~~~~

题目描述
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根。再比如39,把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,这是一个一位数,因此3是39的数根。
输入要求
输入包括一些正整数(小于101000),每个一行。输入的最后一行是0,表示输入的结束,这一行不用处理。
输出要求
对每个正整数,输出它的数根。每个结果占据一行。
假如输入
24
39
0
应当输出
6
3
我的代码:
#include<stdio.h>
int sg(int n)
{
int d=0;
while(n)
{
d=d+n%10;
n=n/10;
}
return d;
}
int main()
{
int n,a;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
a=sg(n);
if(a>=10)
a=sg(a);
printf("%d\n",a);
}
return 0;
}
oj上错误原因:
测试文件:/test.out 结果:答案错误 =======原因====== 当参考答案输出: 6 -------时--------- 你的程序输出: -1 =================测试文件:/sample.out 结果:答案正确
while(scanf("%d",&n)!=EOF) { if(n==0)break; a=sg(n); if(a>=10) a=sg(a); printf("%d\n",a); }
这个循环出错了,如果按你这个代码来执行的话,每次读入一个n的值,循环里都是只计算一次a的值,a的值要么是sg(n),要么是sg(a),然后继续读入新的n的值。
要想满足“如果结果衡伍慧是两位数或者包括更多位的数字,那么再橘茄把这些数字加起来咐答。如此进行下去,直到得到是一位数为止。”这个要求的话,在循环里还得加上一个循环,反复计算a的值,直到其为一位数。
你的程序肯定不对这是定下的,因为要是第二次a还大于10,那么就不对了
所以
a=sg(n);
if(a>=10)
a=sg(a);
这里饥正是要用烂物悔循环来做的
do
n=sg(n)
while(n<10);
因为至少要计算一次,所以用do--while循环
这蚂橘个判断while可能有错,你试验一下吧,要是错了,变成n>=10即可
可能和输入的整数太大有关。你早扮返的数据都是int型,PC机上通常是16bit。数据范围:-32768 ~ + 32767。对于大于+32767的数值,就变成了负值。而你的程序要求的范围是缺液:小于101000。因此超出了int的范围。

把int改成long应该陆饥就OK了。scanf()和printf()等也相应改变:%d ==> %ld。
这么简单的问题还问,gdb,自己调试下不就知道哪错了吗?
子程序里头,while(n)改为if(n/10!=0)试试
首先,你缺了一个大括号,其次,for(a=2;a<卖胡闷=d;a++);这句多了一个分号,导致for循环其实就是一个空语句,然后你中弯再用break语句就会出错,因为break语句不在for循环里。最后,printf("m不是一个素数\n");

printf("m是一个素数\n");这两句打印出来的是“
m不做搏是一个素数”或“
m是一个素数”,而不是你输进去的m值。