繁体   English   中英

找出一个数字的总和(用c表示)

[英]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尚未初始化。 尝试读取未初始化的变量是未定义的行为
  • 进行除法时,您无需添加数字。 您将数字除以连续的10的幂。在1123的情况下,实际上是在相加112 + 11 +1。您需要使用模数而不是除数来获得数字。

您可以在一个循环中进行数字的加法和计数,如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM