关于C语言判断水仙花数的问题

C语言 判断一个数是否为水仙花数
代码如下,输入55,算出来是48,77就是正常的98,输入153、154、155算出来都是217,无法正常计算请问这是怎么回事?

#include <stdio.h>
#include <math.h>
int function(int n);
int main()
{
    int n;
    scanf("%d", &n);
    printf("%d", function(n));
}

int function(int n)
{
    int sum, k, p, q, j, m, l;
    int s = n;
    for(p=1, q=0; p<n; p*=10)
    {
        if (n/p>0)
            q++;
    }
    for (j=pow(10, q-1), sum=0; j>=1; j/=10)
    {
        l=n/j;
        m=pow(l, q);
        sum+=m;
        n=n%j;
    }
    if(sum == s)
        printf("yes");
    else
        return sum;
}

if(sum == n)到这里时,n已经在循环中被你改掉了啊。再for循环前,再定义一个变量等于n,比如 int s = n;然后if(sum==s)才行

可以参考以下代码


#include <stdio.h>
int main()
{   
        int narcissistic( int number );//调用函数声明
    int number;
    scanf("%d",&number);
    if(narcissistic(number))
        printf("%d是水仙花数\n",number);
    else
        printf("%d不是水仙花数\n",number);

    return 0;
}
//主要判断函数
int narcissistic( int number )
{
    int i=1,sum=0,num,k,j;      //i:数字的位数,sum:各位n次方之和,num=number,k和j用来算每位的n次方,n就是数字的位数
    int a[10];                  
    num = number;
    a[0] = number%10;          //将数字的各位存到a[0]中
    while(number>10)           //如果数字大于10,将数字的每位存到a[]数组中
    {
        number=number/10;
        a[i] = number%10;
        i++;
    }
    for(k=0; k<i; k++)        //将每位的n次方存在a[]数组中
    {
        int temp=a[k];
        for(j=0; j<i-1; j++) ;
                a[k] = a[k]*temp;
    }
    while(i>0)               //计算各位n次方之和
    {
        sum+=a[i-1];
        i--;
    }

    if(num == sum)      //是水仙花数返回1,否则返回0
        return 1;
    else
        return 0;

}

void PrintN( int m, int n )
{
    int i;
    for(i=m+1; i<n; i++)
    {
        if(narcissistic(i))
        printf("%d\n",i);
    }
}

提供一个计算多位水仙花数的代码,供参考:

#include <stdio.h>
#include <math.h>
int main()
{
    int N, i, p, t, sum, n, m, k;
    printf("input num(3<= N <=7):");
    scanf("%d", &N);
    for (i = pow(10, N - 1), p = i * 10; i < p; i++) {
        for (sum = 0, t = i; t > 0; t /= 10) {
            m = N; k = 1;
            n = t % 10;
            while (m--)k *= n;
            sum += k;
        }
        if (sum == i)
            printf("%d\n", i);
    }
    return 0;
}