如何在C语言中遍历整数的各个位数?

4

我需要在C语言中迭代一个整数,但不能使用任何高级功能。我不太理解将一个数字对10取模如何与这种迭代有关,或者它如何神奇地返回最后一个整数。

能否有人解释一下如何做到这一点,并展示C代码?

我的代码根本没用,什么都没有输出。但请给我展示一下。

#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;
    // tries to iterate through freaking integer but literally doesn't work or does nothing
    while (x > 0)
    {
        counter = counter + x;
        x = x % 10;
        
    }
    printf("The total sum of the integer's digits are %d\n", counter);


}

如果你理解模数的作用,那么它如何遍历数字应该是显而易见的。 - Barmar
我完全不知道怎么做,而且它也没有起作用。你能帮我一下或者至少给我展示伪代码吗?我们在高中或大学从未学过模数及其逻辑,这些东西真的让我很困惑。为什么和如何通过模数迭代数字,并且你能否注释并展示给我代码?为什么模10可以起作用,而我的代码却不行?请给我展示一下。 - Shah Jacob
你可以将数字输入为字符串,通过简单的迭代来遍历它的每个数字。你可以逐位输入,而且不受int类型所能表示的大小限制。但除此之外,我建议将循环改为 while (x > 0) { counter += x % 10; x /= 10; } - Weather Vane
1个回答

5
你的代码存在几个问题。
第一个问题是在执行以下操作时:
x = scanf("%d", &x);

scanf()函数将输入的值赋给参数x,并返回赋值的变量数量,这里是1。然后x=的赋值操作用1替换了输入的值。因此无论你输入什么,都会把x设置为1。只需使用scanf("%d", &x),不要再对变量进行赋值。

接下来的问题是循环遍历数字的代码。取模运算符%返回除法的余数,所以x % 10返回数字x除以10的余数,即该数字的最后一位(例如,123 / 10返回123的余数)。当你执行以下操作时:

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; 时,将每个数字添加到计数器中。

1
x123 时,x % 103。因此你将 x 设为 3。当 x3 时,x % 10 仍然是 3,所以你再次将 x 设为 3。现在你陷入了一个循环。 - Barmar
1
如果你先除以10,那么最后一位数字就已经被去掉了,所以你不能将它加到计数器中。这就是为什么你需要先进行取模运算的原因。 - Barmar
1
我已经在答案中添加了迭代的详细解释,请阅读并查看它是否能为您澄清事情。 - Barmar
2
不,我不会在我的回复中添加它。一次只能问一个问题。 - Barmar
2
最好您发一个新问题。这不是一个讨论论坛。 - Barmar
显示剩余28条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接