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
问题的关键在于变量 mask
的取值。
根据给定的代码,mask
是一个用于将输入数值中的个位数或十位数或百位数等分离出来的标记。在循环中,mask
的值等于 10^(n-1)
,其中 n
是输入的位数。
问题之所以只输出了 n=3
的情况,是因为 mask
的计算方式导致了只有 n=3
时才能正确分离出每位数字。
为了修复这个问题,我们需要修改两个地方:
main
函数中的第一个循环中,将 i
从 1
修改为 0
,以便在计算 mask
时包括个位数。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 的情况。