AlexMesi 发表于 2019-3-9 01:28:19

N位水仙花数的代码编写问题

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,不知道为什么。

AlexMesi 发表于 2019-3-9 01:29:23

截的图片无法正常上传,不知道为什么。图片地址填写的是对的呀

Croper 发表于 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中间参数,自己查看问题在哪儿。不要一出问题自己没有思考就问,那样永远没法进步


Croper 发表于 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);
        }
}

AlexMesi 发表于 2019-3-9 02:24:58

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

我刚刚自己又编写了一遍,发现了我的for循环和全局变量有问题,现在已经能正常输出了。
感谢指出的问题,估计是太晚了,头已经处于晕的状态了。
单步执行和打印中间值这两个方法我知道到了,下回碰到类似问题一定先用这两个方法来排除。
最后,这么晚了,大神也早点休息。
页: [1]
查看完整版本: N位水仙花数的代码编写问题