你的代码存在几个问题。
第一个问题是在执行以下操作时:
x = scanf("%d", &x);
scanf()
函数将输入的值赋给参数x
,并返回赋值的变量数量,这里是1
。然后x=
的赋值操作用1
替换了输入的值。因此无论你输入什么,都会把x
设置为1
。只需使用scanf("%d", &x)
,不要再对变量进行赋值。
接下来的问题是循环遍历数字的代码。取模运算符%
返回除法的余数,所以x % 10
返回数字x
除以10
的余数,即该数字的最后一位(例如,123 / 10
返回12
和3
的余数)。当你执行以下操作时:
x = x % 10;
如果你陷入了一个无限循环,那是因为一旦你到达一个个位数,你就不断地将 x
设置为自身(除非最后一位数字是0
,否则会失败于while (x > 0)
条件)。这就是为什么你的程序似乎没有做任何事情 - 它永远无法跳出这个循环。
你应该将最后一位数字加到计数器 counter
中,然后通过除以10来删除最后一位数字。所以循环应该是:
while (x > 0)
{
counter = counter + x % 10;
x = x / 10;
}
更正后的代码是:
#include <stdio.h>
int main (void)
{
printf("Enter a value.\n");
int x = 0;
scanf("%d", &x);
while (x < 0)
{
printf("Enter another integer please.\n");
scanf("%d", &x);
}
int counter = 0;
while (x > 0)
{
counter = counter + x % 10;
x = x / 10;
}
printf("The total sum of the integer's digits are %d\n", counter);
}
以下是模量和除法如何迭代处理数字的方法。
假设有一个数字
x = 5649
。
当你计算
x % 10
时,会返回最后一位数字,也就是
9
。
然后你设置
x = x / 10;
,这样它变成了不包括最后一位数字的数字
564
。
下一次循环时,你计算
x % 10
,得到的是这个数字的最后一位数字
4
。
然后你再次设置
x = x / 10;
,这样它变成了不包括最后一位数字的数字
56
。
接下来你计算
x % 10
,返回的是数字的最后一位数字
6
。然后
x = x / 10;
将它设置为
5
。
接下来你计算
x % 10
,返回的是数字的最后一位数字
5
。然后
x = x / 10;
将它设置为
0
。
现在循环停止了,因为条件是
x > 0
,这个条件现在不成立了。
所以你可以看到,循环是从右到左遍历数字的,因为每次都通过除以 10 来移除最后一位数字。同时,当你执行
counter = counter + x % 10;
时,将每个数字添加到计数器中。
int
类型所能表示的大小限制。但除此之外,我建议将循环改为while (x > 0) { counter += x % 10; x /= 10; }
。 - Weather Vane