poj 1365 Prime Land 质因数分解

本文深入解读了一个程序实现的过程,通过字符串处理获取数据,并使用暴力枚举方法进行素数分解,最终将结果按照素数大小逆序输出。详细介绍了程序的关键步骤和算法逻辑,为读者提供了一次深入理解代码实现的机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始没看懂题意。。。

输入p1 e1 p2 e2 ....

输出的是 p1^e1 + p2^e2 + ... + pn^en - 1 拆成素数乘积后每个素数的值及指数的值。按素数由大到小输出

暴力枚举就可以。。。

输入那里的字符串处理是学习的别人的。感觉很简洁就用上了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn = 35000;

int primeNUM[maxn];

struct primestore
{
    int n;
    int cnt;
}prime[maxn];

struct number
{
    int e;
    int p;
}num[maxn];

bool cmp( primestore a, primestore b )
{
    return a.n > b.n;
}

long long getPow( int p, int e )
{
    long long sum = 1;
    for( int i = 1; i <= e; i++ )
        sum *= p;
    return sum;
}

void getPrime( int p )
{
    int t = 0;
    bool primeflag = 1;
    for( int i = 2; i <= p; i++ )
    {
        primeflag = 1;
        for( int j = 2; j <= sqrt( (double) i ); j++ )
        {
            if( i % j == 0 )
            {
                primeflag = 0;
                break;
            }
        }
        if( primeflag )
            primeNUM[t++] = i;
    }
}

int main()
{
    getPrime( maxn );
    while( true )
    {
        char tmp[50];
        int cnt = 0;
        int ct = 0;
        for( int i = 0; i < maxn; i++ )
        {
            prime[i].cnt = 0;
            prime[i].n = -1;
        }
        while( scanf( "%s", tmp ) )
        {
            if( strcmp( tmp, "0" ) == 0 )
                return 0;
            if( ct == 0 )
            {
                sscanf( tmp, "%d", &num[cnt].p );
                ct = 1;
            }
            else
            {
                ct = 0;
                sscanf( tmp, "%d", &num[cnt].e );
                cnt++;
            }
            char ch = getchar();
            if( ch == '\n' )
                break;
        }
        long long sum = 1;
        for( int i = 0; i < cnt; i++ )
        {
            sum *= getPow( num[i].p, num[i].e );
        }
        sum--;
        int index = 0;
        for( int i = 0; primeNUM[i] <= sum; i++ )
        {
            while( sum % primeNUM[i] == 0 )
            {
                sum /= primeNUM[i];
                prime[index].cnt++;
                prime[index].n = primeNUM[i];
            }
            if( prime[index].n == primeNUM[i] )
                index++;
        }

        sort( prime, prime + index, cmp );

        for( int i = 0; i < index - 1; i++ )
        {
            printf( "%d %d ", prime[i].n, prime[i].cnt );
        }
        printf( "%d %d\n", prime[index-1].n, prime[index-1].cnt );
    }
    return 0;
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值