鱼C论坛

 找回密码
 立即注册
查看: 2208|回复: 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
  1. for(index=first ;index<end; index++){
  2.                 for(j=0; j<n; j++){
  3.                         a = index%10;
  4.                         t_num = t_num*a;
  5.                         index = index/10;
  6.                 }
  7.                 if(index == t_num){
  8.                         printf("%d\n", index);
  9.                 }
  10.                 t_num = 0;
  11.         }
复制代码


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


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2019-3-9 02:06:34 | 显示全部楼层    本楼为最佳答案   
  1. for(index=first ;index<end; index++){
  2.                 for(j=0; j<n; j++){
  3.                         a = index%10;
  4.                         t_num = t_num*a;
  5.                         index = index/10;
  6.                 }
  7.                 if(index == t_num){
  8.                         printf("%d\n", index);
  9.                 }
  10.                 t_num = 0;
  11.         }
复制代码


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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  3. int isselfpow(int num){
  4.         int N=log10(num)+1;
  5.         int n=num;
  6.         int sum=0;
  7.         while (n!=0){
  8.                 sum+=pow(n % 10,N);
  9.                 n/=10;
  10.         }
  11.         return num==sum;
  12. }

  13. int main(){
  14.         int N,i;
  15.         printf("请输入自幂数的位数:\n");
  16.         scanf("%d",&N);
  17.         printf("以下是%d位自幂数:\n",N);
  18.         for (i=pow(10,N-1);i<pow(10,N);++i){
  19.                 if (isselfpow(i)) printf("%d ",i);
  20.         }
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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