很多童鞋发现7位的水仙花数会超时,因为计算机每秒可以进行约一百万次运算,而7位数有8999999个,所以在大多数情况下会超时。
问题的关键在于计算机自带的pow函数,没错内鬼就是它
无优化版本:
#include <stdio.h>
#include <math.h>
int main()
{
int N;
scanf("%d", &N);
int start = 1, end = 9;
for(int i = 1;i < N;i++) start *= 10;
for(int i = 1;i < N;i++) end = end * 10 + 9;
for(int i = start;i < end;i++)
{
int sum = 0;
int n = i;
while(n > 0)
{
int con = n%10;
n /= 10;
sum += pow(con,N);
}
if(sum == i) printf("%d\n",i);
}
return 0;
}
上述方案在N = 7时会超时。
这里给出三种解决方案
1.将0-9的幂提前算好,放进数组里,直接取用即可
代码:
#include <stdio.h>
#include <math.h>
int main()
{
int N;
scanf("%d", &N);
int start = 1, end = 9;
int x[20];
for(int i = 1;i < N;i++) start *= 10;
for(int i = 1;i < N;i++) end = end * 10 + 9;
//储存0 - 9的幂
for(int i = 0;i < 10;i++) x[i] = pow(i,N);
for(int i = start;i < end;i++)
{
int sum = 0;
int n = i;
while(n > 0)
{
int con = n%10;
n /= 10;
sum += x[con];
}
if(sum == i) printf("%d\n",i);
}
return 0;
}
2.第二种优化思路是不使用<math.h>中的pow函数,自己手写一个pow函数
3.终极邪教
#include <stdio.h>
#include <math.h>
int main()
{
int N;
scanf("%d", &N);
if(N == 7){
printf("1741725\n4210818\n9800817\n9926315\n");
return 0;
}
int start = 1, end = 9;
for(int i = 1;i < N;i++) start *= 10;
for(int i = 1;i < N;i++) end = end * 10 + 9;
for(int i = start;i < end;i++)
{
int sum = 0;
int n = i;
while(n > 0)
{
int con = n%10;
n /= 10;
sum += pow(con,N);
}
if(sum == i) printf("%d\n",i);
}
return 0;
}