7-10 水仙花数,请问是数字太大的原因吗,只有n=3的时候能出东西

7-10 水仙花数
分数 20
作者 徐镜春
单位 浙江大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本题要求编写程序,计算所有N位水仙花数。

输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。


#include<stdio.h>
#include<math.h>
int f(int i,int n,int mask);
int main(){
    int i,n,mask=1;
    scanf("%d",&n);
    for(i=1;i<n;i++){
        mask*=10;
    }
    for(i=mask;i<pow(10,n);i++){
        if(f(i,n,mask)==i){
            printf("%d\n",i);
        }
    }
}
int f(int i,int n,int mask){
    int s=0,t,j;
    for(j=1;j<=n;j++){
        t=i/mask;//1
        i=i%mask;//53
        mask/=10;
        s+=t*t*t;
    }
    return s;
}
s+=t*t*t;
四位是t*t*t*t
五位是t*t*t*t*t
...

你三位的时候是txtxt
而四位就不对了,应该是txtxtxt
你可以写个函数,算出数字有多少位,然后一个for循环,每次xt

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7553317
  • 这篇博客也不错, 你可以看下C语言,输入一个正整数n,输出所有n位水仙花数
  • 除此之外, 这篇博客: 水仙花数——-计算所有N位水仙花数(有一个测试点超时中的 输入格式: 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的关键在于变量 mask 的取值。

    根据给定的代码,mask 是一个用于将输入数值中的个位数或十位数或百位数等分离出来的标记。在循环中,mask 的值等于 10^(n-1),其中 n 是输入的位数。

    问题之所以只输出了 n=3 的情况,是因为 mask 的计算方式导致了只有 n=3 时才能正确分离出每位数字。

    为了修复这个问题,我们需要修改两个地方:

    1. main 函数中的第一个循环中,将 i1 修改为 0,以便在计算 mask 时包括个位数。
    2. main 函数中的第一个循环结束时,将 mask 的值改为 10^n,以便在循环中正确分离每位数字。

    修改后的代码如下:

    #include <stdio.h>
    #include <math.h>
    
    int f(int i, int n, int mask);
    
    int main(){
        int i, n, mask=1;
        scanf("%d", &n);
        for(i=0; i<n; i++){
            mask *= 10;
        }
        for(i=mask; i<pow(10, n); i++){
            if(f(i, n, mask) == i){
                printf("%d\n", i);
            }
        }
    }
    
    int f(int i, int n, int mask){
        int s=0, t, j;
        for(j=1; j<=n; j++){
            t = i / mask;
            i = i % mask;
            mask /= 10;
            s += t * t * t;
        }
        return s;
    }
    

    这样修改后,程序就能够正确输出所有 N 位水仙花数,而不仅限于 n=3 的情况。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^