判断一个数是否为自幂数
如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。
例如:在十进制中,153是一个三位数,各个数位的3次幂之和为1^3+5^3+3^3=153,所以153是十进制中的自幂数。
程序运行不了
#include
#include
#include
int main(void)
{
int n,i,digit,sum,j,digit0,m;
printf("输入一个不超过10位的正整数:");
scanf("%d",&n);
sum=0;
for (i=0;n/(int)(pow(10,i)+0.1)!=0;i++)//求位数
digit=i+1;
digit0=digit;
for (j=digit0;j!=0;j--)
m=n/((int)(pow(10,j-1)+0.1));//所在位数数字
n=n-m*((int)(pow(10,j-1)+0.1));
sum=sum+(int)(pow(m,digit0)+0.1);
if (sum==n)
printf("Y");
else
printf("N");
return 0;
}
参考GPT和自己的思路:
经过仔细查看你的代码,问题可能出在下面这段循环代码中:
for (j=digit0;j!=0;j--)
m=n/((int)(pow(10,j-1)+0.1));//所在位数数字
n=n-m*((int)(pow(10,j-1)+0.1));
sum=sum+(int)(pow(m,digit0)+0.1);
你少加了一个大括号,导致循环体只有一行代码,具体来说,for循环只循环了第一行代码,即只执行了一次,而不是循环3次,导致结果错误。正确的代码应该是:
for (j=digit0;j!=0;j--)
{
m=n/((int)(pow(10,j-1)+0.1));//所在位数数字
n=n-m*((int)(pow(10,j-1)+0.1));
sum=sum+(int)(pow(m,digit0)+0.1);
}
加上大括号后,循环体就包含了三行代码,就可以正确执行了。
https://blog.csdn.net/weixin_44626069/article/details/86697645
参考GPT和自己的思路:
首先需要纠正一下你的代码,有几个问题:
1.第二个for循环没有使用花括号包裹语句,导致循环体仅包含第一行代码,造成了错误的运行结果;
2.第二个for循环中,应该把判断和求位数的代码移到循环外层,否则会在每次循环中都重新计算一遍位数,导致错误的运行结果;
3.判断自幂数的条件应该是sum==n,而不是sum==digit0。
修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
int n,i,digit,sum,j,digit0,m;
printf("输入一个不超过10位的正整数:");
scanf("%d",&n);
sum=0;
digit=floor(log10(n))+1;//求位数
digit0=digit;
for (j=digit0;j!=0;j--) {
m=n/((int)(pow(10,j-1)+0.1));//所在位数数字
n=n-m*((int)(pow(10,j-1)+0.1));
sum=sum+(int)(pow(m,digit0)+0.1);
}
if (sum==n)
printf("Y");
else
printf("N");
return 0;
}
运行后,可以正确判断一个数是否为自幂数。