题目描述
(附加题)水仙花数是一个三位数,其个位数的立方 + 十位数的立方 + 百位数的立方 = 这个数本身,例如153是一个水仙花数。
试找出100 - 999间的所有水仙花数,并对每个水仙花数找出其所有质因数,例如153的质因数有3,3,17
本题求解一定范围內的水仙花数 并且找出每个水仙花数的所有质因数
所以我们运用模块化编程 把一个大问题 分成为多个模块来解
一.解剖问题
1.怎么判断一个数是水仙花数:每个数的个位数的立方 + 十位数的立方 + 百位数的立方 = 这个数本身
运用到的模块(1).数据立方处理(2)水仙花数判断
2.怎么输出一个数的所有质因数
运用到的模块(1)质数判断(2)质因数求得
二.实现
1.主函数
int main()
{
for (int i= 100; i <= 999; i++)
{
if (nar(i))//判断是否为水仙花数
{
cout << i ;
qua(i);//求得该水仙花数的质因数
cout << endl;
}
}
return 0;
}
2.判断水仙花数函数
//注意因为这个函数的返回值为true或false 所以这里要用bool
//判断一个数是否是水仙花数
bool nar(int num)
{
int sum = 0;//存储每个数的个位数的立方 + 十位数的立方 + 百位数的立方的和
int o_num = num;//记录num初始值
while (num != 0)//当num=0时 对于这个三位数的每一项的数据都处理完毕
{
sum = sum + cube(num % 10);//拆出这个三位数每一项的值 并运用cube()函数将其立方化 加入sum中
num = num / 10;//将拆出的这项数在num中除去
}
//当这个数的个位数的立方 + 十位数的立方 + 百位数的立方的和=这个数 则为水仙花数 输出true
if (o_num == sum)
{
return true;
}
//否则输出false
else
{
return false;
}
}
3.立方数函数
//将数据立方化 并返回其立方值
int cube(int num)
{
return num * num * num;
}
4.求质因数
//求质因数
//这里我用的是 将一个数与质数取余的方法
void qua(int num)
{
int o_num=num;
for (int i = 2; i <= o_num ; i++)
{
//首先判断i是否为质数
if (isprime(i))
{
//然后判断num%i是否为0
while (num % i == 0)
{
num = num / i;
cout << " " << i;
}
}
}
}
5.判断质数
//这里是判断 x 是否为质数
bool isprime(int x) {
//如果x为小于2得数 则肯定不为质数
if (x < 2 ||( x & 1 == 0))
{
return 0;
}
//这里判断x是否为质数得方法 运用了暴力解法 即一个一个得试
//这里i的范围并没有取i<=x 因为考虑到程序效率的问题
//并且>sqrt(x)时 x/i<1 即x%i=x本身 所以考虑i>sqrt(x)没有意义
for (int i = 2; i <= sqrt(x); i++)
{
//如果i在某个范围里 x%i的值不为0 则该数肯定不为质数
if (x % i == 0)
{
return 0;
}
}
//如果i在某个范围里 x%i的值都为0 则该数肯定为质数
return 1;
}
三.整体代码
//题目描述
//(附加题)水仙花数是一个三位数,其个位数的立方 + 十位数的立方 + 百位数的立方 = 这个数本身,例如153是一个水仙花数。
//试找出100 - 999间的所有水仙花数,并对每个水仙花数找出其所有质因数,例如153的质因数有3,3,17
//
//本题求解一定范围內的水仙花数 并且找出每个水仙花数的所有质因数
//所以我们运用模块化编程 把一个大问题 分成为多个模块来解
//
//一.解剖问题
//1.怎么判断一个数是水仙花数:每个数的个位数的立方 + 十位数的立方 + 百位数的立方 = 这个数本身
// 运用到的模块(1).数据立方处理(2)水仙花数判断
//2.怎么输出一个数的所有质因数
// 运用到的模块(1)质数判断(2)质因数求得
#include<iostream>
#include<cmath>
using namespace std;
//将数据立方化 并返回其立方值
int cube(int num)
{
return num * num * num;
}
//注意因为这个函数的返回值为true或false 所以这里要用bool
//判断一个数是否是水仙花数
bool nar(int num)
{
int sum = 0;//存储每个数的个位数的立方 + 十位数的立方 + 百位数的立方的和
int o_num = num;//记录num初始值
while (num != 0)//当num=0时 对于这个三位数的每一项的数据都处理完毕
{
sum = sum + cube(num % 10);//拆出这个三位数每一项的值 并运用cube()函数将其立方化 加入sum中
num = num / 10;//将拆出的这项数在num中除去
}
//当这个数的个位数的立方 + 十位数的立方 + 百位数的立方的和=这个数 则为水仙花数 输出true
if (o_num == sum)
{
return true;
}
//否则输出false
else
{
return false;
}
}
//这里是判断 x 是否为质数
bool isprime(int x) {
//如果x为小于2得数 则肯定不为质数
if (x < 2 ||( x & 1 == 0))
{
return 0;
}
//这里判断x是否为质数得方法 运用了暴力解法 即一个一个得试
//这里i的范围并没有取i<=x 因为考虑到程序效率的问题
//并且>sqrt(x)时 x/i<1 即x%i=x本身 所以考虑i>sqrt(x)没有意义
for (int i = 2; i <= sqrt(x); i++)
{
//如果i在某个范围里 x%i的值不为0 则该数肯定不为质数
if (x % i == 0)
{
return 0;
}
}
//如果i在某个范围里 x%i的值都为0 则该数肯定为质数
return 1;
}
//求质因数
//这里我用的是 将一个数与质数取余的方法
void qua(int num)
{
int o_num=num;
for (int i = 2; i <= o_num ; i++)
{
//首先判断i是否为质数
if (isprime(i))
{
//然后判断num%i是否为0
while (num % i == 0)
{
num = num / i;
cout << " " << i;
}
}
}
}
int main()
{
for (int i= 100; i <= 999; i++)
{
if (nar(i))//判断是否为水仙花数
{
cout << i ;
qua(i);//求得该水仙花数的质因数
cout << endl;
}
}
return 0;
}
ps:以上是我在解这道题的心路历程,可能有一些不完美甚至错误的地方,希望谅解,如果可以的话指出的错误,感谢您阅读我这篇文章。