zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    实现微信小程序和支付宝小程序二维码合并
    Solr教程:1.下载和安装
    如何生成漫画风图片无需下载APP无需PS无需电脑
  • 原文地址:https://www.cnblogs.com/jifahu/p/5571201.html
Copyright © 2011-2022 走看看