请看题目:
打印水仙花数
题目内容:
求出0~100000之间的所有“水仙花数”并输出。
提示:
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
前言:
诸位应该注意到了,这里的水仙花数加了引号,其实水仙花数是自幂数的一种,三位自幂数叫做水仙花数。当然还有其他自幂数啦,一到十位自幂数的美名都在这里:
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
好啦,不啰嗦,开始解题!@Claffic
大体思路:
要求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;
}
你学会了嘛?快动手写写吧。