for循环和模运算符

时间:2019-02-17 01:58:17

标签: c for-loop modulo

  

编写一个计算整数位数之和的程序。例如,数字2155的数字总和为2 +1 + 5 + 5或13。程序应接受用户键入的任意整数。

我可以使用while循环来使它工作,但是如果我将它与for循环一起使用,程序将计算除最后一个数字以外的所有数字。为什么是这样?

#include <stdio.h>

int main(void)
{
    int i, num, sum = 0, temp;

    printf("Enter the number:\n");
    scanf("%i", &num);

    printf("Test for num: %i\n", num); //both num & temp return same number
    temp = num;
    printf("Test for temp: %i\n", temp);

    //while (num > 0)
    for (i = 0; i <= temp; i++)  //replacing temp w/ num will skip last num
    {
        sum += num % 10;
        //sum += right;
        num /= 10;
    }

    printf("Given number = %i\n", temp);
    printf("Sum of digits of %i = %i", temp, sum);

    return (0);
}

3 个答案:

答案 0 :(得分:1)

在您已经注释掉的for循环中使用num时,您是将i与原始数字的红利进行计数,而不是num > 0时。

例如,如果您有num = 158,则将执行循环,然后将num设置为15。i递增为1。因此,i

如果最高位数大于或等于位数,则在for循环中使用num的代码将起作用。否则,它将不会。

您可以摆脱i并在for循环中简单地使用num。

for(;num > 0; num /= 10)
    sum += num%10;

答案 1 :(得分:0)

注意:

for (i = 0; i <= temp; i++)

这是不公平的-如果temp例如543您肯定不会执行544次此循环(尽管循环的结果还可以)在大多数情况下,迭代只会将0添加到已经正确的结果中。)

您的程序带有其原始的while循环

while (num > 0)
{
    sum += num % 10;
    num /= 10;
}

对于较小的数字工作正常,i。 e。例如,在int范围 *)

Enter the number:
1234
Test for num: 1234
Test for temp: 1234
Given number = 1234
Sum of digits of 1234 = 10

Enter the number:
123456789
Test for num: 123456789
Test for temp: 123456789
Given number = 123456789
Sum of digits of 123456789 = 45

但是,例如

Enter the number:
10000000001
Test for num: 1410065409
Test for temp: 1410065409
Given number = 1410065409
Sum of digits of 1410065409 = 30

您可能会看到scanf()函数将10000000001的大数字读为1410065409

但是 while循环的逻辑不是问题,数字1410065409的结果是正确的。


(*)-int的最常见实现的int范围(以32位数字表示)

              from  -2.147.483.648  to  +2.147.483.647.

答案 2 :(得分:0)

执行此操作,在for循环中打印出变量i,并查看其运行频率。这是低效率的,并且明显浪费资源。

您还应该考虑以下内容?

时间复杂度是多少? while循环与使用temp的for循环有何不同?

当您更改为for循环时,您没有考虑while循环中变量num发生了什么。考虑一下,具有n位数字的数字介于10^(n-1)10^n之间。如果让n为N中的位数,则不等式为10^(n-1) <= N < 10^n。由此我们发现时间复杂度为O(log(n))。大约有log10(num)个数字。

您的解决方案是正确的,因为它会产生正确的答案,但性能不高。首先,应该这样减少for循环索引。

 for (i = temp ; i !=0; i /= 10)

使用for循环会更正确。这将与while循环运行相同的次数,但是需要减少i并检查是否i != 0用于迭代。