鱼C论坛

 找回密码
 立即注册
查看: 968|回复: 8

[已解决]下面两个程序中第一个程序为什么无任何输出?

[复制链接]
发表于 2023-6-15 21:09:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编写程序求所有三位数的水仙花数。水仙花数(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 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之间。对于每个取值的可能情况,依次计算出其百位、十位和个位上的数字,判断它们是否符合条件,若成立则输出即可。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-15 21:10:25 | 显示全部楼层
这两个程序之间的区别在于变量m的定义和初始化方式。

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

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

因此,为了计算所有三位数的水仙花数,我们应该像程序2一样,在循环前将变量m初始化为100,然后逐次增加,进行水仙花数的计算即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-15 21:19:40 | 显示全部楼层
青出于蓝 发表于 2023-6-15 21:10
这两个程序之间的区别在于变量m的定义和初始化方式。

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

但是并未影像i,j,k的值啊,后面i,j,k的值还是在for循环里面的啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-15 21:26:45 | 显示全部楼层
@sfqxx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-15 21:28:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-15 21:54:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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之间。对于每个取值的可能情况,依次计算出其百位、十位和个位上的数字,判断它们是否符合条件,若成立则输出即可。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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能正确输出所有的水仙花数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-17 14:40:08 | 显示全部楼层
m未赋值,是一个随机的,例如-32768这个数根本不在100-999之间了,所以i * i * i + j * j * j + k * k * k == m 导致所有的数都不符合条件,大概是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表