鱼C论坛

 找回密码
 立即注册
查看: 1818|回复: 4

[已解决]N位水仙花数的代码编写问题

[复制链接]
发表于 2019-3-9 01:28:19 | 显示全部楼层 |阅读模式

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

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

x
C:\Users\Alex\Desktop\搜狗截图19年03月09日0110_1.png
#include<stdio.h>
int main()
{
        int n = 0;
        int first = 1;
        int end = 1;
        int t_num = 0;
        int i,j;
        int a = 0;
        printf("请输入水仙花的位数:");
        scanf("%d", &n);
        for(i=1; i<n; i++){
                first = first*10;
        }
        end = first*10;
        int index;
        for(index=first ;index<end; index++){
                for(j=0; j<n; j++){
                        a = index%10;
                        t_num = t_num*a;
                        index = index/10;
                }
                if(index == t_num){
                        printf("%d\n", index);
                }
                t_num = 0;
        }
        return 0;
}  
---------------------------------------------------------------------
编译能够通过,但一直输出0,不知道为什么。
最佳答案
2019-3-9 02:06:34
for(index=first ;index<end; index++){
                for(j=0; j<n; j++){
                        a = index%10;
                        t_num = t_num*a;
                        index = index/10;
                }
                if(index == t_num){
                        printf("%d\n", index);
                }
                t_num = 0; 
        }

1、首先,水仙花数是每位上的数字的三次幂之和等于本身的数,你这算的是什么?每位数上的数字的积?
2、即使想知道每位数上的积等于本身的数,你每次t_num重置为0,那么你再乘也只能为0;而n位数的index再除以n次10后,一定为0。if (index==t_num)一定是if(0==0),输出只可能是0
3、你在循环体中对index进行了改变,那么index会保留这个改变,那么index在每次循环中都为0,这是个死循环
4、每位数上的数的积等于其本身的数,只可能是1位数;水仙花数只可能是1位数(1)或3位数;

做题之前理清思路,出了问题学会单步执行或者printf中间参数,自己查看问题在哪儿。不要一出问题自己没有思考就问,那样永远没法进步


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

使用道具 举报

 楼主| 发表于 2019-3-9 01:29:23 | 显示全部楼层
截的图片无法正常上传,不知道为什么。图片地址填写的是对的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-9 02:06:34 | 显示全部楼层    本楼为最佳答案   
for(index=first ;index<end; index++){
                for(j=0; j<n; j++){
                        a = index%10;
                        t_num = t_num*a;
                        index = index/10;
                }
                if(index == t_num){
                        printf("%d\n", index);
                }
                t_num = 0; 
        }

1、首先,水仙花数是每位上的数字的三次幂之和等于本身的数,你这算的是什么?每位数上的数字的积?
2、即使想知道每位数上的积等于本身的数,你每次t_num重置为0,那么你再乘也只能为0;而n位数的index再除以n次10后,一定为0。if (index==t_num)一定是if(0==0),输出只可能是0
3、你在循环体中对index进行了改变,那么index会保留这个改变,那么index在每次循环中都为0,这是个死循环
4、每位数上的数的积等于其本身的数,只可能是1位数;水仙花数只可能是1位数(1)或3位数;

做题之前理清思路,出了问题学会单步执行或者printf中间参数,自己查看问题在哪儿。不要一出问题自己没有思考就问,那样永远没法进步


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

使用道具 举报

发表于 2019-3-9 02:19:40 | 显示全部楼层
本帖最后由 Croper 于 2019-3-9 02:23 编辑

另外,如果你提到的是自幂数的话,
#include <stdio.h>
#include <math.h>

int isselfpow(int num){
        int N=log10(num)+1;
        int n=num;
        int sum=0;
        while (n!=0){
                sum+=pow(n % 10,N);
                n/=10;
        }
        return num==sum;
} 

int main(){
        int N,i;
        printf("请输入自幂数的位数:\n");
        scanf("%d",&N);
        printf("以下是%d位自幂数:\n",N);
        for (i=pow(10,N-1);i<pow(10,N);++i){
                if (isselfpow(i)) printf("%d ",i);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-9 02:24:58 | 显示全部楼层
Croper 发表于 2019-3-9 02:06
1、首先,水仙花数是每位上的数字的三次幂之和等于本身的数,你这算的是什么?每位数上的数字的积?
2 ...

我刚刚自己又编写了一遍,发现了我的for循环和全局变量有问题,现在已经能正常输出了。
感谢指出的问题,估计是太晚了,头已经处于晕的状态了。
单步执行和打印中间值这两个方法我知道到了,下回碰到类似问题一定先用这两个方法来排除。
最后,这么晚了,大神也早点休息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 10:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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