POJ 1365 Prime Land(整数拆分)

  题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致。

  思路:素数打表以后正常拆分即可。

  注意:输入过程需要优化,我以前经常使用字符串模拟的方式,后来发现那种方法比较笨,还是下面的方法简洁;代码如下:

  

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define LL long long
#define maxn 35000
int prime[maxn],e[maxn];
void make_prime()
{
    memset(prime,1,sizeof(prime));
    prime[0] = prime[1] = 0;
    for(int i = 2; i < maxn; i++)
    {
        for(int j = 2*i; j < maxn; j+=i)
        {
            prime[j] = 0;
        }
    }
}
int main()
{
    int a,b;
    char op;
    LL num = 1;
    make_prime();
    while(~scanf("%d",&a))
    {
        if(a == 0) break;
        scanf("%d",&b);
        num = powl(a,b);
        op = getchar();
        if(op == ' ')
        {
            while(~scanf("%d%d",&a,&b))
            {
                op = getchar();
                //printf("a = %d  b = %d op = %c
",a,b,op);
                num *= powl(a,b);
                if(op != ' ') break;
            }
        }
        num = num-1;
        int start,End,flag = 0;
        memset(e,0,sizeof(e));
        for(int i = 2; i <= 32767; i++)
        {
            if(num == 1) break;
            if(prime[i])
            {
                while(num % i == 0)
                {
                    e[i]++;
                    num /= i;
                }
                if(e[i] != 0)
                {
                    if(!flag)
                    {
                        flag = 1;
                        start = i;
                    }
                    End = i;
                }
            }
        }
        for(int i = End; i >= start; i--)
        {
            if(e[i] != 0)
            {
                if(i!=start) printf("%d %d ",i,e[i]);
                else printf("%d %d
",i,e[i]);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5571201.html