整数分解问题

整数分解

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=3
8009

注意点:

用结构体存储数和指数,例如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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值