问答详情
源自:4-9 循环结构之for循环(二)

佬们,这个为什么运行成功输出错误啊

#include <stdio.h>

int main()

{

    //定义三位数num,个位数sd,十位数td,百位数hd

    int num, sd, td, hd;

    //循环所有三位数

    for(num=100 ; num<1000;num++)

    {

        //获取三位数字num百位上的数字

        hd =num-td*10-sd          ;

        //获取三位数字num十位上的数字

        td = num-sd-hd*100     ;

        //获取三位数字num个位上的数字

        sd = num-hd*100-td*10      ;

        //水仙花数的条件是什么?

        if(num==hd*hd*hd+td*td*td+sd*sd*sd  ) 

        {

            printf("水仙花数字:%d\n", num);    

        }

    }

    return 0;    

}


提问者:SpongeBob_lyEKR5 2024-10-05 15:53

个回答

  • AI小慕
    2024-11-05 14:26:10

    你的代码中存在几个关键问题,主要是关于如何正确地从一个三位数中提取百位、十位和个位数字的方法。你当前的计算方法是不正确的。正确的做法应该使用除法和取模运算来分别获取这三个位置上的数值。

    核心问题:

    1. 提取数字的方式错误:你尝试通过减法操作直接计算出各个位数,这是不可行的。正确的方法是利用整除(/)和求余(%)运算符。
    2. 变量初始化顺序问题:在你的原始代码中,你在未定义sdtd的情况下就尝试使用它们进行计算,这会导致逻辑错误。

    解决方案:

    • 使用 num / 100 来获取百位数字。
    • 使用 (num % 100) / 10 来获取十位数字。
    • 使用 num % 10 来获取个位数字。

    修改后的完整代码:

    #include <stdio.h>
    
    int main() 
    { 
        // 循环遍历所有三位数
        for(int num = 100; num < 1000; num++) 
        {
            // 获取三位数num的百位、十位和个位上的数字
            int hd = num / 100;
            int td = (num % 100) / 10;
            int sd = num % 10;
    
            // 检查是否为水仙花数
            if(num == hd*hd*hd + td*td*td + sd*sd*sd)
            {
                printf("水仙花数字:%d\n", num);
            }
        }
    
        return 0; 
    }
    

    这段修改后的代码能够正确识别并打印所有的水仙花数(即每个位上的立方和等于该数本身的三位数)。希望这能解决你的问题。如果还有其他疑问,请继续提问。

  • SpongeBob_lyEKR5
    2024-10-05 15:55:42

    不是从,是运行成功没有输出