A1059
Given any positive integer N, you are supposed to find all of its
prime factors, and write them in the format N = p 1 k 1
×p 2 k 2 ×⋯×p m k m .
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 = p 1 ^k 1 *p
2 ^k 2 *…*p m ^k m , where p i 's are prime
factors of N in increasing order, and the exponent k i is the
number of p i – hence when there is only one p i , k i
is 1 and must NOT be printed out.Sample Input: 97532468
Sample Output: 97532468=2^2*11*17*101*1291
***题目分析:给出一个int范围的整数,按照从小到大的顺序输出其分解为质因式的乘法算式。首先应该把素数表打印出来,然后进行质因子分解操作。
1打印素数表:可以使用“埃式筛法”。
2质因子分解:
一.枚举1-根号n范围内的所有质因子p,判断p是否为n的因子。
-
如果是,那么给fac数组中增加质因子p,并初始化其个数为0.然后,统计p的个数。如果p还是n的质因子,就让n不断除以p,每次操作令p的个数加1,直到p不再是n的因子为止。
-
如果p不是n的因子,则直接跳过。
二. 如果在上面的步骤结束之后n仍然大于1,说明n有且仅有一个大于根号n的因子,将其保存,个数置为1.
时间复杂度为O(根号n)**
代码时间:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100010;
int prime[maxn],pnum=0;
bool p[maxn]= {0};
void find_prime()
{
for(int i=2; i<maxn; i++)
{
if(p[i]==false)
{
prime[pnum++]=i;
}
for(int j=2*i; j<maxn; j+=i)
{
p[j]=true;
}
}
}
struct factor
{
int x;
int cnt;
} fac[10];
int main()
{
find_prime();
int n,num=0;
while(scanf("%d",&n)!=EOF)
{
num=0,fac[num]= {0};
if(n==1)
{
printf("1=1");
}
else
{
printf("%d=",n);
int sqr=(int)sqrt(1.0*n);//列举根号n以内的质因子
for(int i=0; i<pnum&&prime[i]<=sqr; i++)
{
if(n%prime[i]==0) //如果是n的质因子
{
fac[num].x=prime[i];//记录下来
fac[num].cnt=0;//记录该质因子个数
while(n%prime[i]==0) //计算该质因子prime[i]所有的个数
{
fac[num].cnt++;
n/=prime[i];
}
num++;//计算下一个质因子
}
if(n==1)
break;
}
if(n!=1) //如果无法被根号n以内的质因子除尽
{
fac[num].x=n;//那么一定有一个大于根号
//n的质因子
fac[num++].cnt=1;
}
for(int i=0; i<num; i++)
{
if(i>0)
printf("*");
printf("%d",fac[i].x);
if(fac[i].cnt>1)
{
printf("^%d",fac[i].cnt);
}
}
}
}
return 0;
}