# include <iostream>
# include <climits>
# include <vector>
# include <cmath>
using namespace std;
const int maxn = 100010;
vector<int> prime;
bool p[maxn] = {false}; // 埃式筛法,p[i] == false说明未被筛选掉,p[i]是素数;否则不是
void Find_Prime()
{
for(int i=2;i<maxn;++i)
if(p[i] == false){
prime.push_back(i);
for(int j=i+i;j<maxn;j+=i)
p[j] = true;
}
}
struct Fact{
int x; // 质因子
int cnt; // 相同质因子的个数
};
int main()
{
Find_Prime();
long long N;
cin >> N;
// 特例为1的情况
if(N == 1){
cout << "1=1" << endl;
return 0;
}
printf("%lld=", N);
vector<Fact> F;
// 遍历素数表,找到质因子(每一次循环都会判断一个质数是不是质因子,是就加入F并且找到有多少个相同的,不是就及你如下一次循环)
for(size_t i=0;i<prime.size();++i) // 这里的条件判断可以再加一个&& prime[i]<=sqrt(N)会更快一点(没追求,无所谓,在循环结束后面还要判断N!=1,麻烦死)
{
// 找到一个质因子
if(N % prime[i] == 0)
{
F.push_back({(int)prime[i], 0});
// 找相同的质因子有多少个
while(N % prime[i] == 0){
F.back().cnt++;
N /= prime[i];
}
}
if(N==1) break; // 及时退出循环,加快速度(没追求,无所谓)
}
// 按格式输出
for(size_t i=0;i<F.size();++i)
{
cout << F[i].x;
if(F[i].cnt > 1)
cout << "^" << F[i].cnt;
if(i!=F.size()-1)
cout << "*";
}cout << endl;
return 0;
}
【PAT甲级、C++、数学】1059 Prime Factors (25分)
最新推荐文章于 2022-10-31 18:24:58 发布