zeroto-alittel 发表于 2023-6-15 21:09:21

下面两个程序中第一个程序为什么无任何输出?

编写程序求所有三位数的水仙花数。水仙花数(Narcissistic number)是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个水仙花数,因为153=1^3+5^3+3^3。
程序1:为啥无任何输出?
#include <stdio.h>
int main(void)
{
int m,i,j,k;
i=m/100;
j=m/10%10;
k=m%10;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
          for(k=0;k<=9;k++)
                  if(i*i*i+j*j*j+k*k*k==m)
                          printf("水仙花数为:%d\n",m);
return 0;
}
程序2:输出正确
#include <stdio.h>
int main(void)
{
int m,i,j,k;
for(m=100;m<=999;m++)
{
i=m/100;
j=m/10%10;
k=m%10;
if(i*i*i+j*j*j+k*k*k==m)
printf("水仙花数为:%d\n",m);
}
return 0;
}

青出于蓝 发表于 2023-6-15 21:10:25

这两个程序之间的区别在于变量m的定义和初始化方式。

在程序1中,变量m只是声明了,但并未进行初始化,也就是说它的值是不确定的。而在接下来的循环中,又使用了m变量的值来计算i、j、k的值,这样就导致了i、j、k的值也是不确定的,从而影响了后面的水仙花数的计算。因此,程序1无法正确输出水仙花数。

而在程序2中,变量m在循环前被初始化为100,因此在循环中m的值逐次增加,并成功计算出每个三位数是否为水仙花数。

因此,为了计算所有三位数的水仙花数,我们应该像程序2一样,在循环前将变量m初始化为100,然后逐次增加,进行水仙花数的计算即可

zeroto-alittel 发表于 2023-6-15 21:19:40

青出于蓝 发表于 2023-6-15 21:10
这两个程序之间的区别在于变量m的定义和初始化方式。

在程序1中,变量m只是声明了,但并未进行初始化, ...

但是并未影像i,j,k的值啊,后面i,j,k的值还是在for循环里面的啊?

zeroto-alittel 发表于 2023-6-15 21:26:45

@sfqxx

Threebody1 发表于 2023-6-15 21:28:16

zeroto-alittel 发表于 2023-6-15 21:26
@sfqxx

@isdkz

sfqxx 发表于 2023-6-15 21:54:05

zeroto-alittel 发表于 2023-6-15 21:26
@sfqxx

{:10_256:}

sfqxx 发表于 2023-6-15 22:01:47

程序1和程序2都是求所有三位数的水仙花数的程序。但它们有着不同的输出结果,原因在于它们的代码实现有所不同。

程序1中无法得到正确的输出结果,因为它的变量没有被初始化好。具体来说,程序中的m、i、j和k都是整型变量,当它们没有初始化时,它们的值是随机的,而非0-9之间的数字。因此,即使在程序的最外层循环里分别枚举i、j和k的取值范围(1~9和0~9),这些循环也无法找到任何一个符合条件的水仙花数,也就没有任何输出了。

而程序2正确地输出了所有三位数的水仙花数。它使用了一个for循环,将所有三位数的可能值(从100到999)逐个测试,只有符合“每个位上的数字的n次幂之和等于它本身”的条件才会输出。

因此,正确的输出所有三位数的水仙花数的代码如下:

#include <stdio.h>

int main(void)
{
    int m, i, j, k;
    for (m = 100; m <= 999; m++)
    {
      i = m / 100;
      j = (m % 100) / 10;
      k = m % 10;
      if (i * i * i + j * j * j + k * k * k == m)
      {
            printf("水仙花数为:%d\n", m);
      }
    }
    return 0;
}

在这个代码中,我们将m的范围限定为100到999之间。对于每个取值的可能情况,依次计算出其百位、十位和个位上的数字,判断它们是否符合条件,若成立则输出即可。

求最佳答案{:10_254:}

isdkz 发表于 2023-6-16 00:22:34

在程序1中,你在 for 循环外部对i、j、k进行了赋值,但此时的m并没有被赋值,因此其值是未定义的。然后你在 for 循环内部判断if(i*i*i+j*j*j+k*k*k==m) 。这里的m仍然是未定义的值,所以你无法通过这个if语句来找到水仙花数。

另一方面,你在内部 for 循环中是对i、j、k进行赋值和判断的,这样并不能够形成一个三位数去判断是否为水仙花数,因为这些变量并不是由一个三位数的各个位数得来的,而是通过单独的 for 循环得到的。

在程序2中,你正确地在 for 循环内部对m进行了赋值,并在此基础上计算了m的百位、十位和个位数字(i、j、k)。然后你正确地用这些数字的立方和与m进行比较。所以,程序2能正确输出所有的水仙花数。

天真的小白 发表于 2023-6-17 14:40:08

m未赋值,是一个随机的,例如-32768这个数根本不在100-999之间了,所以i * i * i + j * j * j + k * k * k == m 导致所有的数都不符合条件,大概是这样
页: [1]
查看完整版本: 下面两个程序中第一个程序为什么无任何输出?