题目:
https://www.nowcoder.com/pat/5/problem/4112
https://pintia.cn/problem-sets/994805342720868352/problems/994805415005503488
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
#include<bits/stdc++.h>
using namespace std;
struct factor
{
int x;
int cnt;
} fac[10];//10个质数相乘已经超出了int表示的范围
int main()
{
int n;
cin>>n;
int m=n; //用m存一下!!以便输出。
//n=1,特判。
if(n==1)
{
cout<<"1=1";
return 0; //别忘记及时return,终止程序!!
}
int num=0; //记录n的质因子的个数
//1、求出质因子:
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++)
{
if(n%i==0)
{
fac[num].x=i;
fac[num].cnt=0;
while(n%i==0)
{
fac[num].cnt++;
n/=i;
}
num++;
}
if(n==1) break;
}
if(n!=1) //存在大于sqrt(n)的质因子
{
fac[num].x=n;
fac[num].cnt=1;
num++;
}
//2、输出:
cout<<m<<'=';
for(int i=0;i<num;i++)
{
//未输出到最后一个质因子
if(i<num-1)
{
if(fac[i].cnt==1)
{
cout<<fac[i].x<<'*';
}
else
{
cout<<fac[i].x<<'^'<<fac[i].cnt<<'*';
}
}
//处理最后一个
else
{
if(fac[i].cnt==1)
{
cout<<fac[i].x;
}
else
{
cout<<fac[i].x<<'^'<<fac[i].cnt;
}
}
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100010;
bool is_prime(int n)
{
if(n==1) return false;
else
{
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++)
{
if(n%i==0) return false;
}
return true;
}
}
int prime[maxn];
int pnum=0;
/*
因为大部分数字的因子分解,都是可以通过某几个质数的重现得到,即一个质数可能在因子分解式中出现多次;
所以,无需一直求到n的质数,前几次测试出现的段错误,都是因为开的质数表放不下了。
*/
/*
//错误代码:
void find_prime(int n)
{
for(int i=2;i<n;i++)
{
if(is_prime(i)==true) prime[pnum++]=i;
}
}
*/
void find_prime()
{
for(int i=2;i<maxn;i++)
{
if(is_prime(i)==true) prime[pnum++]=i;
}
}
struct factor
{
int x;
int cnt;
}fac[10];
int main()
{
find_prime();
int n;
int num=0; //不同质因子的个数
cin>>n;
//find_prime(n);
if(n==1) cout<<"1=1";
else
{
cout<<n<<"=";
int sqr=(int)sqrt(1.0*n);
for(int i=0;i<=pnum&&prime[i]<=sqr;i++)
{
if(n%prime[i]==0)
{
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)
{
fac[num].x=n;
fac[num].cnt=1;
num++;
}
//按格式输出
for(int i=0;i<num;i++)
{
//if(i>0) cout<<'*';
cout<<fac[i].x;
if(fac[i].cnt>1) cout<<'^'<<fac[i].cnt;
if(i>=0&&i<num-1) cout<<'*';
}
}
return 0;
}