2.算法分析与模拟枚举(2)
阿姆斯特朗数
今天的题型还是枚举,但是这道题让我十分抓狂,当时思考了很长时间,发现如果暴力枚举肯定会时间超限,最后还是在老师的指导下想到了用合理限度内用“空间换时间”的原则解决的。
什么是以空间换时间的原则?
以我的理解之下,时间不够用时,在合适限度内用空间换取更多时间的原则叫做“空间换时间”原则。具体意思是指在时间超限时,用打表或者调用的方式可以节省更多程序的运行时间的方法。它可以让我们的程序运行更快,时间更短,Bug更少等优点,节省更多繁琐的操作。
题目描述
编程找出所有的三位数到七位数中的阿姆斯特朗数。阿姆斯特朗数也叫水仙花数,它的定义如下:若一个n位自然数的各位数字的n次方之和等于它本身,则称这个自然数为阿姆斯特朗数。例如,153(153=1X1X1+3X3X3+5X5X5)是一个三位的阿姆斯特朗数,8208则是一个四位的阿姆斯特朗数。
输出描述
每行输出一个阿姆斯特朗数,按从小到大的顺序按行输出。
如何解决·思路(第一步)
本题的数据范围是百万级别的,如果要算时间复杂度那必定是次方级别增长,所以暴力枚举就首先被程序员否定掉了。那么应该如何解决呢?我们在开始之前应该思考一个问题,应该如何在空间允许的情况下换取更多时间来解决问题。这一点直接关联到刚才提及的“空间换时间”原则。有了这个原则之后应该怎么用呢?我们首先采取打表的方式试试看,在程序开始运行之前做个预处理,方便程序运行的时候可以直接调用,省去了复杂的计算过程。
代码如下
int a[10][10],n[10]; //定义数组a,用来做预处理
for(int i=0;i<=9;i