枚举案例_阿姆斯特朗数
题目描述
编程找出所有的三位数到七位数中的阿姆斯特朗数。阿姆斯特朗数也叫水仙花数,它的定义如下:若一个n位自然数的各位数字的n次方之和等于它本身,则称这个自然数为阿姆斯特朗数。例如,153(153=1X1X1+3X3X3+5X5X5)是一个三位的阿姆斯特朗数,8208则是一个四位的阿姆斯特朗数。
样例
输出
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
分析
本题运用的编程思想是用空间换时间,减少时间复杂度。如果直接枚举计算,效率会非常低。所以我们可以预先进行处理,使用二维数组预处理出所有数字的各次幂值
- 预处理,处理出3—7位自然数的各位数字的3—7次方,用一个二维数组存储
- 数位分离,用一个数组存储
- 将每一位数的幂值累加起来
- 判断与原数是否相符,如果相符就输出
代码
#include <stdio.h>
#include <iostream>
using namespace std;
int a[10][8];
int f[10];
int main(){
//预处理
for(int i=1;i<=9;i++){
a[i][1]=i;
for(int j=2;j<=7;j++){
a[i][j]=a[i][j-1]*i;
}
}
//枚举过程
for(int i=100;i<=9999999;i++){
int t=i;
int num=0;//记录数位
//数位分离
while(t){/
num++;
f[num]=t%10;
t=t/10;
}
int sum=0;
for(int j=1;j<=num;j++){
sum=sum+a[f[j]][num];//直接从表中找到幂值
}
if(sum==i){
printf("%d\n",sum);
}
}
return 0;
}