PAT A1059

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值