每一个大于等于2的自然数,均可写成一个或多个质数的乘积,例如:
2=2
20=2*2*5
这种将一个整数分割成若干个质数之积的操作叫做分解质因数。现在,给你一个整数N,请你编写一个程序,对其分解质因数。
Input Format
输入为一行,正整数N,保证1<N<2147483647 1<N<2147483647 。
Output Format
输出N的质因数分解形式,格式为 N=P1(E1)P2(E2)P3(E3).... 其中,P1、P2、P3、……为组成N的各个质因子,
满足P1 < P2 < P3 < ...;E1、E2、E3、……分别为P1、P2、P3、……在N中的指数。
例如:
20=2*2*5
应该输出成:
20=2(2)5(1)
Hint
N的大于sqrt(N)的质因子至多有一个。(sqrt(n)指N的开方取整)
Sample Input
20
Sample Output
20=2(2)5(1)
查找质数函数
//查找质数
void find_prime(int maxn){
//k记录第几个质数
int k = 0;
//2 - 1001 之间的质数
for(int i = 2;i <= maxn;i++){
if(vis[i] == false){
//记录质数
prim[k++] = i;
//去除非质数
for(int j = i * 2;j <= maxn;j += i)
vis[j] = true;
}
}
}
代码:
#include <iostream>
#include <cstdio>
#include <set>
#include <map>
using namespace std;
const int m = 7001;
int prim[m] = {0};
bool vis[m][m] = {false};
map<long long,int> sumz;
set<int> q;
//查找质数
void find_prime(int maxn){
//k记录第几个质数
int k = 0;
//2 - 1001 之间的质数
for(int i = 2;i <= maxn;i++){
if(vis[i/m][i % m] == false){
//记录质数
prim[k++] = i;
//去除非质数
for(int j = i * 2;j <= maxn;j += i)
vis[j / m][j % m] = true;
}
}
}
int main(int argc, char const *argv[]) {
//待求解数字
int N;
scanf("%d",&N);
//记录N最初值 在输出时用
int in = N;
//返回质数数组
find_prime(N);
//N = 1 说明求解结束
while (N != 1) {
//prim <= N -- N的质数因子永远小于等于N
for(int i = 0;prim[i] <= N;i++){
//是其因子
if(N % prim[i] == 0){
//记录因子出现次数
sumz[prim[i]]++;
//q 存储 排序去重
q.insert(prim[i]);
//对N进行规模减小
N /= prim[i];
break;
}
}
}
int i = 0;
printf("%d=",in);
for(auto i:q){
printf("%d",i);//输出因子
printf("(%d)",sumz[i]);//输出因子的指数
}
return 0;
}