• 唯一分解定理


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

    算术基本定理,又称为正整数的唯一分解定理,即:每个大于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;
        }
    }
  • 相关阅读:
    Android将TAB选项卡放在屏幕底部(转)
    unix进程间通信
    C优先级顺序(转)
    C/C++ 内存补齐机制
    Android Sqlite ORM 工具
    类型安全性测试
    反射手册笔记 2.程序集,对象和类型
    CLR笔记:15.委托
    反射手册笔记 4.创建对象
    反射手册笔记 1.灵活的编程方法
  • 原文地址:https://www.cnblogs.com/acbingo/p/4532254.html
Copyright © 2020-2023  润新知