紫薯上的两个例题都提到了唯一分解定理
算术基本定理,又称为正整数的唯一分解定理,即:每个大于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; } }