POJ1365 Prime Land【质因数分解】【素数】【水题】

题目链接:
http://poj.org/problem?id=1365

题目大意:
告诉你一个数的质因数x的所有底数pi和幂ei,输出x-1的质因数的所有底数和幂

解题思路:
这道题不难,但是题意特别不好理解,对于我这种英文渣的人,愣是一个小时没看明白

关于题意举例说明吧  

例如 509 1 59 1  

x = 509^1 * 59^1 = 30031

x-1 = 30030

则答案 13 1 11 1 7 1 5 1 3 1 2 1 就是 x-1 = 13^1 * 11^1 * 7^1 * 5^1 *3^1 *2^1 

= 30031   

那么直接按着题意暴力解决就行了。。。。。


AC代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
/*
pow函数说明
原型:extern float pow(float x, float y);
用法:#include <math.h>
功能:计算x的y次幂。
说明:x应大于零,返回幂指数的结果。
*/
double p[110],e[110];
int Prime[35000],E[35000];

void IsPrime()
{
    Prime[0] = Prime[1] = 0;
    for(int i = 2; i <= 35000; i++)
    {
        Prime[i] = 1;
    }
    for(int i = 2; i <= 35000; i++)
    {
        for(int j = i+i; j <= 35000; j+=i)
        {
            Prime[j] = 0;
        }
    }
}
int main()
{
    int count,sign;
    IsPrime();
//    for(int i = 2; i <= 35000; i++)
//        if(Prime[i])
//            printf("%d ",i);
    while(1)
    {
        count = 0,sign = 0;
        memset(p,0,sizeof(p));
        memset(e,0,sizeof(e));
        memset(E,0,sizeof(E));

        while(1)
        {
            scanf("%lf",&p[count]);
            if(p[count] == 0)
            {
                sign = 1;
                 break;
            }
            scanf("%lf",&e[count]);
            count++;
            char c = getchar();
            if(c=='\n')
                break;
        }

        if(sign == 1)
            break;

        double num = 1;
        for(int i = 0; i < count; i++)
            num *= pow(p[i],e[i]);

        int sum = (int)num - 1;
//        printf("%d\n",sum);
        int flag = 0,pos = 2;
        for(int i = 2; i <= 32767; i++)
        {
            if(sum == 1)
                break;
            if(Prime[i])
            {
                while(sum % i == 0)
                {
                    E[i]++;
                    sum /= i;
                    if(flag == 0)
                    {
                        flag = 1;
                        pos = i;
                    }
                }
            }
        }

        for(int i = 32767; i>= 2; i--)
        {
            if(E[i]!=0 && i!=pos)
                printf("%d %d ",i,E[i]);
            else if(E[i]!=0 && i==pos)
            {
                printf("%d %d\n",i,E[i]);
                break;
            }
        }
    }

    return 0;
}



你可能感兴趣的:(POJ1365 Prime Land【质因数分解】【素数】【水题】)