资源限制
时间限制: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);
}
运行结果:
评测结果: