唯一分解定理

紫薯上的两个例题都提到了唯一分解定理

 

算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的,而且这些素因子按大小排列之后,写法仅有一种方式。

证明见wiki:http://zh.wikipedia.org/wiki/%E7%AE%97%E6%9C%AF%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86

下面给出计算唯一分解式的代码

int fac[100][2];//一张表,fac[i][0]存放素因数,fac[i][1]存放其指数
void factor(int m)//分解m
{
    int&num = fac[0][0];//fac[0][0]是表头,存放总的个数,用引用比较方便
    num = 0;
    for (int i = 2; i*i <= m;i++)
    if (m%i == 0)
    {
        fac[++num][0] = i;
        fac[num][1] = 0;
        do
        {
            fac[num][1]++;
            m /= i;
        } while (m%i == 0);//将i除干净
    }
    if (m > 1)//如果分解到最后m仍然大于1,说明它是一个素数。注意:如果只是判断素因子有哪些,可以没有此处判断,否则必须有此步
    {
        fac[++num][0] = m;
        fac[num][1] = 1;
    }
}

 

利用这段代码解决了UVa10791

 

更新:

学习了vector以及pair后,写出了另外一种代码,使得整体结构更清晰

有个题使用此代码发生RE,不知道为什么。。。

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <vector>
using namespace std;
/******************/
//唯一分解定理
//prime_factors();将n分解成质因子的积的形式(相同的用指数表示)
//返回vector<pair<int,int> >的pair,first为底数,second为指数
vector<pair<int,int> > prime_factors(int n){
    vector<pair<int,int> > f;
    int m=floor(sqrt(n)+0.5);
    int p=0,q=0;
    for (int i=2;i<=m;i++){
        q=0;
        if (n%i==0) p=i;
        while (n%i==0) {q++; n /= i;}
        if (p) f.push_back(make_pair<int,int>(p,q));
    }
    if (n>1) f.push_back(make_pair<int,int>(n,1));
    return f;
}
/******************/
int main()
{
    int n;
    cin>>n;
    vector<pair<int,int> >f=prime_factors(n);
    for (int i=0;i<f.size();i++){
        cout<<f[i].first<<" "<<f[i].second<<endl;
    }
}

 

posted @ 2015-05-27 03:18  ACBingo  阅读(938)  评论(0)    收藏  举报