目录
一.水仙花数
1.什么是水仙花数
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身。
如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。
2.设计要求
求出0~100000之间的所有“水仙花数”并输出。
3.思路
给定一个数据data,求取data是几位数,获取data中每个位置上的数据,利用pow函数进行次方运算,并求和,若求和结果与data元素本身相等,则为水仙花数,否则,不是。
1.计算数据num的个位数,并将其赋值给temp。
2.计算个位数的n次幂,并累加到sum中。
3.移位操作,将num减去个位数temp后,再除10,便相当于数据的右移操作。此时减少一位,并将
结果重新赋值给num。
4.重复步骤(1)的操作,直到所有的位数都得到处理为止。
4.分析
1.给定一个数,求这个数的位数
利用给个数除以10,得到比这个数低一位的数来计算这个数有多少位。
例:1是由1位数字组成,12是由2位数字组成,123是由3位数字组成。
1:1/10=0(结束)
1由1位数字组成
12:12/10=1
1/10=0(结束)
12由2位数字组成
123:123/10=12
12/10=1
1/10=0(结束)
while (tmp / 10)
{
count++;
tmp = tmp / 10;
}
2.计算每一位数
该数字连续模10和除以10即可得到每一位。
while (tmp)
{
n = tmp % 10
tmp = tmp / 10;
}
3.计算每一位的n次方和
这里我们运用pow来求次方数;
必须加入头文件:#include <math.h>
pow(a, b);//计算a的b次方
#include <math.h>
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
}
5.代码源
#include <stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i <= 999999; i++)
{
int count = 1;
int tmp = i;
int sum = 0;
//判断i是否为水仙花数
//1. 求判断数字的位数
while (tmp / 10)
{
count++;
tmp = tmp / 10;
}
//2. 计算每一位的次方和
tmp = i;
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
}
//3. 判断
if (sum == i)
printf("%d ", i);
}
return 0;
}
二、变种“水仙花数”
1.什么是变种“水仙花数”
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1*461 + 14*61 + 146*1
求出 5位数中的所有 Lily Number。
2.设计要求
输入描述:
无
输出描述:
一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。
3.思路
以此为例讲解变种水仙花数(1461 = 1*461 + 14*61 + 146*1)
我们都知道%10能求出一个数的一位,/10能去掉一位。
146(1461/10) 1(1461%10)
14(1461/100) 61(1461%100)
1(1461/1000) 461(1461%1000)
4.代码源
#include <stdio.h>
int main()
{
int i = 0;
for(i=10000; i<=99999; i++)
{
//判断i是否为lily number
int j = 10;
int sum = 0;
int tmp = i;
for(j=10; j<=10000; j*=10)
{
sum += (tmp%j)*(tmp/j);
}
if(sum == i)
printf("%d ", i);
}
return 0;
}