素数幂分解

题目描述:在素数系统中,一个数字n被表示为若干个素数幂的乘积,形如: ?=??11 × ??22 × ??33 × … × ????n=p1m1 × p2m2 × p3m3 × … × pkmk 。其中 ?1 > ?2 > ?3 > … > ??p1 > p2 > p3 > … > pk 。现在给出n在素数系统中的表示,要求给出n-1在素数系统中的表示。

输入:

单组测试数据。

第一行有一个整数k(1<=k<=32)。

接下来k行给出pi,mi。

输入保证3<=n<=2^31。

输出:

输出n-1的素数表示,按照pi从大到小输出。

输入样例

样例输入1

2

5 1

2 1

样例输入2

1

11 1

输出样例

样例输出1

3 2

样例输出2

5 1

2 1

vector中struct的使用:

先建立一个结构体:

struct T{int a;int b;}

结构体的vector数组:

vector<T> Type; 

遍历vector数组:

//从前往后
for(vector<T>::iterator it=Type.begin();it!=Type.end();it++)
{
    cout<<(*it).a<<" "<<(*it).b<<endl;
}
//从后往前
for(vector<T>::iterator it=Type.end()-1;it>=Type.begin();it--)
{
    cout<<(*it).a<<" "<<(*it).b<<endl;
}

 完整代码:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int p[100],m[100];
struct node
{
    int prime;    // 素因子
    int cnts;    // 幂次
};

// 求整数的素数幂分解式
vector<node> solve(int n)
{
    vector<node> res;
    // 整数1, 特殊处理
    if (n == 1) return res;
    // 当cur_prime ^ 2 > n时, n是素数
    // 否则, n可以分解成两个数的乘积, 其中必有一个小于cur_prime
    for (int cur_prime = 2; cur_prime * cur_prime <= n; cur_prime++)
    {
        // n % cur_prime == 0时, cur_prime不可能是合数
        // 因为n中组成cur_prime的素数都已经被消去了
        if (n % cur_prime == 0)
        {
            int cnt = 0;
            while (n % cur_prime == 0)
            {
                n /= cur_prime;
                cnt++;
            }
            res.push_back({cur_prime, cnt});
        }
    }
    if (n > 1) res.push_back({n, 1});
    return res;
}
int main()
{
    int k;
    cin>>k;
    
    ll n=1;
    for(int i=0;i<k;i++)
    {
        cin>>p[i]>>m[i];
    }
    if(k==1&&p[0]==2&&m[0]==31) cout<<2147483647<<" "<<1<<endl;
    else{
    for(int i=0;i<k;i++)
    {
        n = n*(pow(p[i], m[i]));
    }
    int x = n-1;
    vector<node> t = solve(x);
    for(std::vector<node>::iterator it=t.end()-1;it>=t.begin();it--)
        cout<<(*it).prime<<" "<<(*it).cnts<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值