7-11 素因子分解(20 分)
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km
,其中pi
为素因子并要求由小到大输出,指数ki
为pi
的个数;当ki
为1即因子pi
只有一个时不输出ki
。
输入样例:
1323
输出样例:
1323=3^3*7^2
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
int main()
{
vector<int>P;
int A[10000] = { 0 };
for (int i = 2; i < 100; i++)
{
if (A[i] == 0)
{
for (int j = i * i; j < 10000; j += i)
A[j] = 1;
}
}
long n;
cin >> n;
cout << n << "=";
while (1)
{
long t = n;
for (int k = 2; k <= sqrt(n); k++)
{
if (A[k] == 0 && n%k == 0)
{
P.push_back(k);
n = n / k;
break;
}
}
if (n == t)
{
P.push_back(n);
break;
}
}
int sum = 1;
for (int q = 0; q < P.size()-1; q++)
{
if (P[q] == P[q + 1])
sum++;
else
{
if (sum == 1)
cout << P[q] << "*";
else
{
cout << P[q] << "^" << sum << "*";
sum = 1;
}
}
}
if (sum == 1)
cout << P[P.size() - 1] ;
else
cout << P[P.size() - 1] << "^" << sum;
return 0;
}
算法分析:
(1)先用素数筛找到前10000项的素数当除数用
(2)用一个无限循环寻找素因子,当n本身不发生变化时退出循环,即n为1或者没有素因子
(3)将之前得到的素因子存入一个数组中,遇到前后不同的输出,否则sum++,sum为系数的指数,1的时候不用输出