题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805415005503488
059 Prime Factors (25分)
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pmkm.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int.
Output Specification:
Factor N in the format N =
p1^
k1*
p2^
k2*
…*
pm^
km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.
Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
题目大意:给你一个正整数n,求它所有的质因子,然后按照格式输出
质因子分解就是将一个正整数n写成一个或者多个质数的乘积的形式,例如6=2*3,8=2*2*2。或者我们也可以写成指数的形式,如6=2^1 * 3^1,8=2^3。最后都要归结成不同质数的乘积,不如先把素数表打印出来。
const int ma = 100010;
int prime[ma],pn=0;//存储质数表
bool p[ma]={0};
void find_prime(){//求质数表
for(int i=2;i<ma;i++){
if(p[i]==false){
prime[pn++]=i;
for(int j=i+i;j<ma;j+=i){
p[j]=true;
}
}
}
}
定义结构体factor来存储质因子及其个数,fac数组的大小只要开到10就可以了,再打就超过int范围了
struct factor{
int x,cnt;//x为质因子,cnt为个数
}fac[10];
枚举1~sqrt(n)所有的质因子p,判断p是否是n的因子。
if(n%prime[i]==0){//prime[i]为n的因子
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0){//计算因子个数
fac[num].cnt++;
n/=prime[i];
}
num++;
}
如果上述步骤结束之后n依然大于1,说明n本身也是一个质因子,需要把n也加入。
解题思路:求质因子,上面的知识点已经给的差不多了,唯一需要注意的地方就是n=1的时候,输出”1=1“
代码如下:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int ma = 100010;
int prime[ma],pn=0;//存储素数表
bool p[ma]={0};
struct factor{
int x,cnt;//x为质因子,cnt为个数
}fac[10];
void find_prime(){//求质数表
for(int i=2;i<ma;i++){
if(p[i]==false){
prime[pn++]=i;
for(int j=i+i;j<ma;j+=i){
p[j]=true;
}
}
}
}
int main()
{
find_prime();
int n,num=0;
cin>>n;
if(n==1)//特殊情况
cout<<"1=1";
else{
cout<<n<<"=";
int sqr=sqrt(n);
for(int i=0;i<pn&&prime[i]<=sqr;i++){
if(n%prime[i]==0){//prime[i]为n的因子
fac[num].x=prime[i];
fac[num].cnt=0;
while(n%prime[i]==0){//计算因子个数
fac[num].cnt++;
n/=prime[i];
}
num++;
}
if(n==1)break;//及时推出
}
if(n!=1){//说明n为最大的质因子
fac[num].x=n;
fac[num++].cnt=1;
}
for(int i=0;i<num;i++){//按格式输出
if(i>0)cout<<"*";
cout<<fac[i].x;
if(fac[i].cnt>1){
cout<<"^"<<fac[i].cnt;
}
}
}
return 0;
}