试题 基础练习 分解质因数

资源限制
时间限制:1.0s 内存限制:512.0MB


问题描述
  求出区间[a,b]中所有整数的质因数分解。


输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)


样例输入
3 10
样例输出
3=3
4=2×2
5=5
6=2×3
7=7
8=2×2×2
9=3×3
10=2×5


提示
  先筛出所有素数,然后再分解。
数据规模和约定
  2<=a<=b<=10000


解题思路:

  • 首先要获取整数N的质因数
  • 然后利用循环输出对应N的质因数。

质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。除了1以外,两个没有其他共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式 [1] 。只有一个质因子的正整数为质数。
每个合数都可以写成几个质数(也可称为素数)相乘的形式 [2] ,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数;而这个因数一定是一个质数。
转载于:https://baike.baidu.com/item/%E8%B4%A8%E5%9B%A0%E6%95%B0/6192269?fr=aladdin

解题方法:

我自定义了一个函数find(int n),其作用是找到传入数据n的质因数,然后再用一个自定义函数show(int x,int y)来进行输出。在find函数中我使用了multiset容器,

不了解容器的可以浏览本人上一篇文章:完美的代价。同样使用了容器,并附上了链接,是对set和multiset容器的详细讲解。

从2到sqrt(n),找n的质因数,然后递归调用find函数即可。输出的话要注意的是最后一项是没有“×”的。详细见源代码。

源代码:

#include<iostream>
#include<math.h>
#include<set>//multiset包含在该头文件中。
using namespace std;
multiset<int>m;
void find(int n)//找传入数据n的质因数
{
    
    
	int flag = 0;//一个标识符,如果flag=0,说明该整数的质因数为其本身。
	for (int i = 2; i <= sqrt(n); i++)//从2到sqrt(n)即可,此处不做详细解释。
	{
    
    
		if (n % i == 0)
		{
    
    
			flag = 1;//存在非其本身的质因数,改变标识符的值。
			m.insert(i);//将该质因数存入容器。
			if (n / i != i)//当不相等的时候采用递归。
			{
    
    
				find(n / i);
				break;//!!!,此处一定要加上,原因是例如12的质因数为2和3,不加的话,程序会把4存入容器。
			}
			if (n / i == i)//相等的时候,直接存入容器。
			{
    
    
				m.insert(i);
			}
		}
	}
	if (flag == 0)//说明除了本身没有其他质因数,例如5,就直接把n存入容器中即可。
		m.insert(n);
}
void show(int x, int y)//输出质因数的函数
{
    
    
	for (int i = x; i <= y; i++)
	{
    
    
		find(i);
		multiset<int>::iterator p = m.begin();//此处要在find(i)后定义,不然容器是空的啊!
		if (m.size() == 1)
		{
    
    
			cout << i << "=" << i << endl;//说明质因数就是他本身
		}
		else
		{
    
    
			cout << i << "=";
			for (int j = 0; j < m.size(); j++)//此处就是输出的问题,最后一项不能有“*”这个符号,可自行理解,应该有更好的办法。
			{
    
    
				if (j < m.size() - 1)
				{
    
    
					cout << *p << "*";
					p++;
				}
				if (j == m.size() - 1)
					cout << *p;

			}
			cout << endl;
		}
		m.clear();//不要忘记把容器清空,一个i对应一个容器。
	}
}
int main()
{
    
    
	int x, y;
	cin >> x >> y;
	show(x, y);
}

运行结果:

在这里插入图片描述

评测结果:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49243150/article/details/113098201
今日推荐