C语言 3位数水仙花数以及牛客网变种水仙花数,多种方法求解

先看水仙花数:

输出所有的水仙花数,水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153=1^3 + 5^3 + 3^3

思路:
我们要做的是把三位数逐位拆开,因此我们可以定义三个变量用于存储各位。
解法:
用循环遍历100到1000之间,即所有的三位数。拿153举例,得到各位数后用三个变量接收,如果各位的三次方相加等于 153 ,即打印 153 。
上代码。

#include
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
#include 
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 包含数学库头文件。
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 
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 
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,因此这个步骤是多余的。

大家可以自行优化代码,尝试自行写代码求出十万以内的原版水仙花数

你可能感兴趣的:(C/C++,c语言,c++,算法)