文章目录
- 题目描述(水仙花数)
- 思路
- 代码示例
- 方法一
- 方法二
- 题目描述(变种水仙花数)
- 思路
- 代码示例
题目描述(水仙花数)
求出0~1000之间的所有“水仙花数”并输出。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
思路
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
由水仙花数的定义,则需要分离出个位数、十位数和百位数。然后进行计算并判断,满足条件则打印输出,否则不打印输出。
所以,可以利用循环语句解决。设循环变量为 n,初值为 100,n 从 100 变化到 1000;依次判断条件是否成立,如果成立则输出,否则不输出。
算法思想具体如下:
分离出个位数,算术表达式为:a = i /100。
分离出十位数,算术表达式为:b = i % 10 / 10。
分离出百位数,算术表达式为:c = i % 10。
判断条件是否成立。若是,则打印出结果;若不是,则n自增,直到 n 等于 1000。
代码示例
方法一
方法一:使用do…while语句
#include <stdio.h>
#include <math.h>
int main()
{
int num=100,a,b,c;
do
{
//首先将三位数的各位提取出来//
a=num/100; //百位
b=num/10%10; //十位
c=num%10; //个位
//if(num==(a*a*a+b*b*b+c*c*c))//可以用这条代码替换下面那条
if(num==(pow(a,3)+pow(b,3)+pow(c,3)))//使用pow()函数必须添加头文件<math.h>
printf("%d \n",num);
num++;
}
while (num<1000);
return 0;
}
运行结果:
153
370
371
407
方法二
方法二:使用for循环语句
#include<stdio.h>
#include<math.h>
int main()
{
int i,sum;
printf("水仙花数有:");
for(i=100;i<1000;i++)
{
sum=(i/100)*(i/100)*(i/100)+(i%100/10)*(i%100/10)*(i%100/10)+(i%100%10)*(i%100%10)*(i%100%10);
if(i==sum)
{
printf("%d\n",sum);
}
}
return 0;
}
运行结果:
153
370
371
407
题目描述(变种水仙花数)
求出5位数中的所有 Lily Number
思路
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1461 + 1461 + 146*1
代码示例
#include<stdio.h>
int main()
{
for (int i = 10000; i <= 99999; i++)
{
int sum = (i % 10) * (i / 10) + (i % 100) * (i / 100) + (i % 1000) * (i / 1000) + (i % 10000) * (i / 10000);
if (sum == i)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}