[英]Find the sum of digits of a number(in c)
我需要找到一个数字的总和。 例如,数字1123的数字总和为1 + 1 + 2 + 3 = 7
我的点子:
1)用户输入整数
2)我计算数字中的位数(在上述情况下-4位数)
3)比起for循环,我将用户数除以10等于1,2的幂,直到数字位数(不包括最后一位)并求和。
这是我的代码:
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位,总和也为零)。 你能解释为什么会发生吗? 我该如何纠正我的解决方案?
附言:我知道我的问题存在更有效的解决方案,但是我想使用自己的算法。
这里有几个问题:
while
循环时, result
尚未初始化。 尝试读取未初始化的变量是未定义的行为 。 您可以在一个循环中进行数字的加法和计数,如下所示:
sum = 0;
while(number > 0){
sum += number % 10;
number /= 10;
++counter;
}
printf("The number consists of %i digits\n",counter);
printf("%i",sum);
简单得多:
result = number;
sum = 0;
counter = 0;
while(result != 0){
sum += result % 10;
result /= 10;
++counter;
}
printf ("Counter:%d sum:%d\n", counter, sum);
首先,为了获得最佳调试效果,请使用具有不同数字的数字,例如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位精度)。
代码中有很多错误,但总体而言,整个方法是错误的。 数位数是不必要的。
一个更简单的方法是:
unsigned temp = number, sum = 0;
while (temp) {
sum += temp % 10;
temp /= 10;
}
注意,您知道何时停止循环,因为temp
变为0( temp
作为条件等于temp != 0
)。 您不需要事先知道位数。
如果使用您的代码,它将起作用:
for(n=1;n<=counter;++n){
sum += number%10;
number /= 10;
}
printf("%d",sum);
更简单的解决方案:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.