时间限制: 1000 ms 内存限制: 65536 KB
提交数:38818 通过数: 24788
【题目描述】
把一个合数分解成若干个质因数乘积的形式(即求质因数的过程)叫做分解质因数。分解质因数(也称分解素因数)只针对合数。
输入一个正整数n,将n分解成质因数乘积的形式。
【输入】
一个正整数n。
【输出】
分解成质因数乘积的形式。质因数必须由小到大,见样例。
【输入样例】
36
【输出样例】
36=2*2*3*3
【提示】
【数据范围】
对于所有数据,2≤n≤20000
解析
1、这道题首先我们要关注题目的输出格式,怎么才能实现题目的形式呢?
第一步实现“n=”
cin >> n;
cout << n << '=';//输出格式
第二步实现“因数*因数”
因此它的格式就是先输出第一个因数
然后就是 *因数 的格式了。
所以我们需要一个标志,标记第一个因数
bool isFirst = true;//是否是输出的第一个数
2、怎么求质因数呢?
我们求质因数可以分为两步:
- 求因数:要求一个数n的因数,我们可以把1到n-1这个区间所有的数进行判断(这个时候我们是不是可以用循环了呀),是不是能被n整除(我们可以判断n%i==0),如果是,那么它就是因数。
另外这道题,需要注意的是,每次找到一个因数之后需要把n变小哟(n/i),这样当n=0的时候,就证明我们把所有的因数都完了。就可以退出循环了。
- 判断质数:当我们求完因数之后,我们再对这个数进行判断,它是不是素数呢?下面这个代码就可以判断i是不是素数。(如果理解不了,可以硬记哟)
for(int j=2;j*j<=i;j++) { if(i % j == 0) { flag = 0;//如果存在i能整除的数,那么i就不是素数 } }
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, i = 2;
cin >> n;
cout << n << '=';//输出格式
bool isFirst = true;//是否是输出的第一个数
while(n >1 )
{ int flag = 1;//判断每个i是否为素数,1表示是,0表示不是
for(int j=2;j*j<=i;j++)
{
if(i % j == 0)
{
flag = 0;//如果存在i能整除的数,那么i就不是素数
}
}
if(n % i == 0 && flag ==1)
{
if(isFirst)//如果是第一个数,不输出*
isFirst = false;
else//如果是后面的数,输出*
cout << '*';
cout << i;
n /= i;//n发生变化,除以i
}
else
i++;
}
return 0;
}