筛选法 || 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;
}

  

原文地址:https://www.cnblogs.com/pinkglightning/p/8410407.html