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,不知道为什么。 截的图片无法正常上传,不知道为什么。图片地址填写的是对的呀 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: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);
}
} Croper 发表于 2019-3-9 02:06
1、首先,水仙花数是每位上的数字的三次幂之和等于本身的数,你这算的是什么?每位数上的数字的积?
2 ...
我刚刚自己又编写了一遍,发现了我的for循环和全局变量有问题,现在已经能正常输出了。
感谢指出的问题,估计是太晚了,头已经处于晕的状态了。
单步执行和打印中间值这两个方法我知道到了,下回碰到类似问题一定先用这两个方法来排除。
最后,这么晚了,大神也早点休息。
页:
[1]