C语言:水仙花数问题如何解决

img


水仙花数问题,请问以下代码哪里出错了

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    //n = 3;
    int first = 0;
    int num = 1;
    while (first < n)
    {
        first++;
        num *= 10;
    }
    //printf("num = %d\n",num);
    int i = num/10;
    while (i < num)
    {
        int d = 1;
        int a = i;
        int sum = 0;
        do
        {
            d = a%10;
            a /= 10;
            int j = 1;
            int p = d;
            while (j < n)
            {
                p *= d;
                j++;
                sum += p;
            }  
        } while (i > 0);
        if (sum == i)
            {
                printf("%d\n",i);
            }   
        i++;
    }
}
```c



```

总共二个问题:
1.在第二个 do-while 循环中,循环条件应为 i > 0 而不是 a > 0。因为此处的目标是检查变量 i 是否大于零,以便正确地计算水仙花数。
2.在第二个 do-while 循环结束后,应将变量 sum 重置为零,以便在下一次迭代中使用。
这是给你修改后的代码:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    int first = 0;
    int num = 1;
    while (first < n) {
        first++;
        num *= 10;
    }

    int i = num / 10;
    while (i < num) {
        int d = 1;
        int a = i;
        int sum = 0;

        do {
            d = a % 10;
            a /= 10;
            int j = 1;
            int p = d;
            while (j < n) {
                p *= d;
                j++;
            }
            sum += p;
        } while (a > 0);

        if (sum == i) {
            printf("%d\n", i);
        }
        
        i++;
    }

    return 0;
}

而且你的代码用while嵌套太多了,不便于阅读代码,我帮你改进了一下代码

#include <stdio.h>
#include <math.h>

int main() {
    int n;
    printf("请输入位数:");
    scanf("%d", &n);

    int start = pow(10, n - 1);
    int end = pow(10, n);

    printf("%d位数的水仙花数有:\n", n);
    for (int num = start; num < end; num++) {
        int temp = num;
        int sum = 0;

        while (temp != 0) {
            int digit = temp % 10;
            sum += pow(digit, n);
            temp /= 10;
        }

        if (sum == num) {
            printf("%d\n", num);
        }
    }

    return 0;
}

如果对你有帮助给我个采纳谢谢

img


感谢回答,该图是我刚想出来的解决方案,希望指正