蹲家宅宅 2023-07-10 11:31 采纳率: 52%
浏览 55
已结题

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



```

  • 写回答

2条回答 默认 最新

  • Lee哈 前端领域新星创作者 2023-07-10 11:58
    关注

    总共二个问题:
    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;
    }
    
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月10日
  • 已采纳回答 7月10日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型