zoukankan      html  css  js  c++  java
  • 筛选法 || POJ 1356 Prime Land

    英文题读不懂题==质数幂的形式给你一个数 把它减一再用质数幂的形式表示出来
    *解法:质数从小到大模拟除一遍,输入有点别扭
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define SZ 33005
    char a[100];
    bool isprime[SZ];
    int primes[SZ], num[SZ];
    int cnt;
    void prime(int n)
    {
        memset(isprime, 1, sizeof(isprime));//1->是素数,0->不是素数
        memset(primes, 0, sizeof(primes));
        isprime[0] = 0;
        isprime[1] = 0;
        cnt = 0;
        for(int i = 2; i <= n; i++)//========高亮!i<=n!高亮=========
        {
            if(!isprime[i]) continue;
            primes[cnt++] = i;
            for(int j = i * i ; j <= n; j += i)//========高亮!j<=n!高亮=========
                isprime[j] = 0;
        }
        //cnt:n以内有cnt个质数
        return;
    }
    int main()
    {
        while(1)
        {
            int n = 0, tmp1 = 0, tmp2 = 0, ans = 1;
            gets(a);
            int len = strlen(a);
            for(int i = 0; i <= len; i++)
            {
                if(a[0] == '0') return 0;//等于0的时候终止 可以直接写return 0
                if(a[i] == ' ' || a[i] == '')
                {
                    if(n % 2 == 1)
                    {
                        for(int j = 0; j < tmp2; j++)
                            ans *= tmp1;
                        tmp1 = 0, tmp2 = 0;
                    }
                    n++;
                    if(a[i] == ' ') continue;
                    else break;
                }
                if(n % 2 == 0) tmp1 = tmp1 * 10 + a[i] - '0';
                else tmp2 = tmp2 * 10 + a[i] - '0';
            }
            ans -= 1;
            prime(ans);//求ans内的质数
            memset(num, 0, sizeof(num));
            int j = 0;
            while(j < cnt)
            {
                if(ans % primes[j] == 0)
                {
                    num[j]++;
                    ans /= primes[j];
                }
                else j++;
                if(ans == 1) break;
            }
            for(int i = cnt - 1; i >= 0; i--)
            {
                if(!num[i]) continue;
                printf("%d %d ", primes[i], num[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    IO模型
    协程
    线程
    进程总结
    HashMap和Hashtable有什么区别
    HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的
    GC线程是否为守护线程?
    float f=3.4;是否正确?
    final、finally和finalized的区别?
    Eureka注册中心是什么?
  • 原文地址:https://www.cnblogs.com/pinkglightning/p/8410407.html
Copyright © 2011-2022 走看看