目录
(全文1095字|看完大概需要十五分钟)
学习前提
已掌握while for if do...while语句
契机
相信初学者在学习循环结构时会碰到这样一道题-----求水仙花数。笔者在查找相应的算法时却发现网上能够求出水仙花数的算法不能求出其它位数的自幂数,而能实现求各个位数的算法却过于复杂,对于初学者有较高的门槛。偶然间在看浙大翁恺教授的视频发现了更好的算法,于此分享给大家。
预备知识
自幂数:如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和。
例如:一个三位自然数的自幂数 153=1^3+5^3+3^3
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
(该部分内容源自百度百科 自幂数 的词条)
代码
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n); //输入想求的位数,如想求水仙花数就输入3,意为求三位数的自幂数
int i=1;
int first=1;
while ( i<n ){ //求出对应位数最小的值,如求水仙花数时,三位数范围内最小的是100
first *=10;
i++;
}
printf("first=%d\n",first);
i =first;
while ( i<first*10 ){ // 用穷举法来逐一列出自幂数,这里以超出范围为判定标准,如求水
int t =i; //仙花数时,范围内最大的值是999,于是就以大于1000为结束条件
int sum =0;
do {
int d =t%10; //从个位开始,将每个位上的数抽离出来
t/=10;
int p=d;
int j=1;
while ( j<n ){
p*=d; //实现简单的幂函数 将各位上的数进行次方
j++;
}
sum +=p; //最后逐个相加
}while ( t>0 );
if ( sum ==i ){
printf ("%d\n",i); //输出符合条件的数
}
i++;
}
return 0;
}
程序分析
该算法用到了穷举法。先计算出所要求几位数的自幂数的最小值,再通过逐一在范围内筛选来求出符合条件的数字。需要注意的是,该算法未用到函数库中的幂函数,而是用一个简易的循环语句来充当幂函数,其意在帮助初学者更好的掌握循环语句,并锻炼思维能力,培养计算机思维。
最后
笔者在测试该代码时发现,但位数到八时,运算的速度已经明显变慢了,而在测试求十位的自幂数时,运行时间过长放弃了,故此算法并不适用于求较大位数的自幂数,更多的是为了初学者掌握相关的语句。
(笔者水平有限,如有错误,还请各位读者朋友斧正)