整数分解
Description
根据数论的有关理论可知,任何大于1的正整数都可唯一地表示为形如(P1N1)*(P2N2)*…(Pm^Nm)的形式。请你编程序实现。
Input
输入:第一行是测试数据的组数N(N小于10000),接着是N行正整数,每行一个,每个正整数不超过32767。
Output
输出:形式是M=(P1N1)*(P2N2)*…(Pm^Nm)。
说明:(a)如果幂的值为1,则不用写括号和1次幂;如:15=3*5。
(b)如果N是素数,也不用写括号和1次幂;如:7=7。
(c)如果因子只有一个,也不用写括号;如:27=3^3。
Sample Input
2
25608
24027
Sample Output
25608=(2^3)31197
24027=38009
注意点:
用结构体存储数和指数,例如2^3即为a[i].p=2,a[i].m=3;
#include <bits/stdc++.h>
using namespace std;
const int MAX=20;
bool is_prime(int n);
struct node
{
int p;
int m;
}a[10010];
int main()
{
int t,n;
scanf("%d",&t);
while (t--)
{
memset(a,0,sizeof a);
scanf("%d",&n);
printf("%d=",n);
if(n==1)
{
printf("1^0\n");
continue;
}
if(is_prime(n))
{
printf("%d\n",n);
continue;
}
int cnt=0;
for(int i=2;i<=n;i++)
{
if(n%i==0)
cnt++;
while (n%i==0)
{
a[cnt].p=i;
a[cnt].m++;
n/=i;
}
}
if(a[2].m==0&&a[2].p==0)
{
printf("%d^%d\n", a[1].p, a[1].m);
continue;
}
for(int i=1;i<cnt;i++)
{
if(a[i].m==1)
printf("%d*",a[i].p);
else
printf("(%d^%d)*",a[i].p,a[i].m);
}
if(a[cnt].m==1)
printf("%d\n",a[cnt].p);
else
printf("(%d^%d)\n",a[cnt].p,a[cnt].m);
}
return 0;
}
bool is_prime(int n)
{
if(n==1)
return false;
else if(n==2)
return true;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}