判断一个数是否为自幂数如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数

判断一个数是否为自幂数

如果在一个固定的进制中,一个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;
}

运行后,可以正确判断一个数是否为自幂数。