先看水仙花数:
输出所有的水仙花数,水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153=1^3 + 5^3 + 3^3
思路:
我们要做的是把三位数逐位拆开,因此我们可以定义三个变量用于存储各位。
解法:
用循环遍历100到1000之间,即所有的三位数。拿153举例,得到各位数后用三个变量接收,如果各位的三次方相加等于 153 ,即打印 153 。
上代码。
#include<stdio.h>
int main()
{
for (int i = 100;i < 1000;i++)
{
int a = i / 100;//153直接÷100得到1
int b = (i % 100)/10;//153模100得到53,再÷10得到5
int c = i % 10;//153直接模10得到3
if (i == a * a * a + b * b * b + c * c * c)
{
printf("%d ", i);
}
}
return 0;
}
如果嫌if语句太难看,我们可以调用数学库里的pow函数。
#include<stdio.h>
#include <math.h>
int main()
{
for (int i = 100;i < 1000;i++)
{
int a = i % 10;//3
int b = (i % 100)/10;//
int c = i / 100;//1
if (i == pow(a, 3) + pow(b, 3) + pow(c, 3))
{
printf("%d ", i);
}
}
return 0;
}
#include <math.h> 包含数学库头文件。
pow(x,y)函数可用于计算x的y次方。
能够理解上面的内容我们再拓展,看另外一个题目——变种水仙花
变种水仙花数 - Lily Number:
把任意的数字,从中间拆分成两个数字,比如1461
可以拆分成(1和461),(14和61),(146和1),
如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如: 655= 6 * 55 + 65 * 5
1461 = 1 * 461 + 14 * 61 + 146 * 1
先要求求出十万以内的所有 Lily Number
思路:
如果仿照上面那种思路,我们要在1000内,1000到10000,10000到100000写出不同的代码,怎么判断数字在哪个区间呢?很简单,只要判断如果数字除以1000==0,即数字在1000内,除以10000得到1000到10000之间的,剩下的就是十万内的了。
解法:
例如1461,将1461÷1000和%1000分别得到1和461,÷100和%100分别得到14和61,÷10和%10分别得到146和1,再彼此相乘后相加再判断,如果if语句成立即打印。
具体代码如下:
#include <stdio.h>
int main()
{
for (int i = 100;i < 100000;i++)
{
if (i / 1000 == 0)
{
if ((i % 100) * (i / 100) + (i % 10) * (i / 10) == i)
printf("%d ", i);
continue;
}
else if (i / 10000 == 0)
{
if ((i % 1000) * (i / 1000) + (i % 100) * (i / 100) + (i % 10) * (i / 10) == i)
printf("%d ", i);
continue;
}
else if ((i % 10000) * (i / 10000) + (i % 1000) * (i / 1000) + (i % 100) * (i / 100) + (i % 10) * (i / 10) == i)
{
printf("%d ", i);
continue;
}
}
return 0;
}
针对不同情况我们写出不同的代码。这里我省略步骤,没有用变量接收各个值,而是在if()里直接计算后用于判断,(因为如果用变量接收会比较难处理)导致代码看起来非常冗杂且难看。我们可以采用更为简便的方式:
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 100; i < 100000; i++)
{
for (int j = 10; j <= 10000; j = j * 10)
{
sum = sum + (i % j) * (i / j);
}
if (sum == i)
printf("%d ", i);
sum = 0;
}
return 0;
}
代码中的 j 作为除数和模数,每次都自乘10,定义一个sum接收每次计算后得到的结果,如果sum==这个数自身就打印。当然每次循环结束后sum都要置零,否则sum会一直加下去,越加越大,永远无法等于 i。
当然代码还可以再优化,因为当数字为1000时,除以10000会得到0,因此这个步骤是多余的。
大家可以自行优化代码,尝试自行写代码求出十万以内的原版水仙花数。