请看题目:
打印水仙花数
题目内容:
求出0~100000之间的所有“水仙花数”并输出。
提示:
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
前言:
诸位应该注意到了,这里的水仙花数加了引号,其实水仙花数是自幂数的一种,三位自幂数叫做水仙花数。当然还有其他自幂数啦,一到十位自幂数的美名都在这里:
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
好啦,不啰嗦,开始解题!
大体思路:
要求0~100000之间的自幂数,当然先生成0~100000之间的整数 i 。然后根据自幂数的特点进行判断。
要做的就是
1.计算出 i 是 n 位数;
2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等。
解题:
1.计算出 i 是 n 位数
以153为例,这是个三位数,3 是怎么来的呢?
153/10 = 15 15/10 = 1 1/10 = 0;(整形之间的除法只取商的整数部分)
直到 0 ,进行了三次;
按照这个思路写出代码:
int main() { int i = 0; for (i = 0; i <= 1000000; i++) { //1.计算出 i 是 n 位数 int n = 1; int tmp = i;//下面的循环会篡改i的值,此处把i放到tmp中进行循环 while (tmp > 9)//两位数进入循环,放过一位数(一位数都属自幂数) { tmp /= 10; n++;//计数器 } }
2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等
%10 取出个位,/10去掉个位 照此循环直到0即可;
求 i 每一位的 n 次方,可以用pow()函数;
tmp = i;//原理同上 int sum = 0; while (tmp) { sum += pow(tmp % 10, n);//计算 i 每一位的 n 次方并求和 tmp /= 10; } if (sum == i) { printf("%d ", i); }
结果展示:
#include<stdio.h> #include <math.h>//包含pow()函数 int main() { int i = 0; for (i = 0; i <= 1000000; i++) { //1. 计算出i是几位数 - n int n = 1; int tmp = i; while (tmp > 9)//153 { tmp /= 10; n++;//1 2 3 } //2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等 tmp = i; int sum = 0; while (tmp) { sum += pow(tmp % 10, n); tmp /= 10; } if (sum == i) { printf("%d ", i); } } return 0; }
你学会了嘛?快动手写写吧。