我需要找到一个数字的总和。例如,数字1123的数字之和是1 + 1 + 2 + 3 = 7
我的想法:
1)用户输入和整数
2)我计算了数字中的位数(以上情况--4位数)
3)比使用for循环我将用户数除以10 ...的功率直到数字位数(不包括最后一位)并将数字相加。
这是我的代码:
int main (void)
{
int result,sum,n;
int div = 10,counter = 0,number;
printf("Enter the integer:");
scanf("%i",&number);
while(result >0){
result = number/div;
div *= 10;
++counter;
}
printf("The number consists of %i digits\n",counter);
sum = 0;
for(n=1;n<counter;++n){
sum += number/pow(10,n);
}
printf("%i",sum);
return 0;
}
第一部分(while循环)分别正常工作。但与第二部分(for循环)一起,它给出了不正确的结果(来自while循环的0位数,且总和也为零)。你能解释一下为什么会这样吗? 我该如何纠正我的解决方案?
P.S我知道我的问题存在更有效的解决方案,但我想使用我自己的算法。
答案 0 :(得分:2)
这里有几个问题:
while
循环时,result
尚未初始化。试图读取未初始化的变量是undefined behavior。您可以按如下方式在单个循环中添加和计算数字:
sum = 0;
while(number > 0){
sum += number % 10;
number /= 10;
++counter;
}
printf("The number consists of %i digits\n",counter);
printf("%i",sum);
答案 1 :(得分:1)
更简单:
result = number;
sum = 0;
counter = 0;
while(result != 0){
sum += result % 10;
result /= 10;
++counter;
}
printf ("Counter:%d sum:%d\n", counter, sum);
答案 2 :(得分:1)
首先,为了获得最佳调试,请使用具有不同数字的数字,例如12345。
进行调试,计算和打印数字与累积数字分开。也就是说,不是sum += <... complex code ...>
,而是这样做:
int digit = ...
printf("Next digit is %i\n", digit);
sum += digit;
另外(你应该通过调试发现这一点,但很明显可以直接注意),你的数字计算算法是错误的。做这样的事情:
int div = 1;
for (...)
{
digit = number / div % 10;
div *= 10;
}
请注意,我在此处不使用pow
,因为pow
使用浮点运算,其精度有限。如果int
具有64位精度(不太可能但可能),浮点将计算大数字的无意义(它只有53位精度)。
答案 3 :(得分:0)
代码中存在许多错误,但总体而言整个方法都是错误的。计算数字是不必要的。
更简单的方法是:
unsigned temp = number, sum = 0;
while (temp) {
sum += temp % 10;
temp /= 10;
}
请注意,您知道何时停止循环,因为temp
变为0(temp
,因为条件等同于temp != 0
)。您无需事先知道位数。
答案 4 :(得分:0)
如果使用您的代码,这将有效:
for(n=1;n<=counter;++n){
sum += number%10;
number /= 10;
}
printf("%d",sum);
答案 5 :(得分:0)
更简单的解决方案:
int c, n=0, sum=0;
printf("Enter number");
while((c=getchar())!='\n') { // IMPORTANT: '\n' in unix, '\r' in windows
if(c<'0' || c>'9') {
printf("Bad value");
break;
}
sum+=c-'0'; // c is the ASCII code of the digit, so you have to subtract an offset
n++;
}
printf("Number of digits: %d", n);
printf("Sum of digits: %d", sum;