1024: 实验2-8 附加题:水仙花数 解题报告

题目描述
(附加题)水仙花数是一个三位数,其个位数的立方 + 十位数的立方 + 百位数的立方 = 这个数本身,例如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:以上是我在解这道题的心路历程,可能有一些不完美甚至错误的地方,希望谅解,如果可以的话指出的错误,感谢您阅读我这篇文章。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值