标签:因数分解 相同 cin while mes flag 正整数 ios false
唯一分解定理:每一个大于1的正整数均可分解为有限个素数的积,如果不计素因数在乘积中的次序,则分解方式是唯一的。将n的素因数分解中相同的素因子收集到一起,可只每个大于1的正整数n可唯一地写成 n = p1a1p2a2p3a3...pkak,其中,p1,p2,p3,...,pk ,是互不相同的素数,而a1,a2,a3,...,ak 是正整数,上面的分解式称为n的标准分解。
性质:n的正约数个数,τ(n) = (1+a1)(1+a2)(1+a3)......(1+ak) ;n的正约数之和,σ(n)=(1+p1+...+p1a1)(1+p2+...+p2a2)...(1+pk+...+pkak)
模板代码:
1 /* */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 #include <cmath> 7 #include <algorithm> 8 using namespace std; 9 typedef long long ll; 10 const int maxn=1e5; 11 bool is[maxn]; 12 int cnt=0; 13 ll a[maxn];//存素数 14 ll ds[maxn],zs[maxn];//ds是底数,zs是指数 15 16 void init()//打表,欧拉筛 17 { 18 memset(is,true,sizeof(is)); 19 is[0]=is[1]=false; 20 for(int i=2;i<maxn;i++) 21 { 22 if(is[i]) a[cnt++]=i; 23 for(int j=0; i*a[j]<maxn&&j<cnt; j++) 24 { 25 is[i*a[j]]=false; 26 if( i%a[j]==0 ) break; 27 } 28 } 29 } 30 31 ll fj(ll x)//不同素数的个数 32 { 33 ll k=0,flag=0; 34 for(ll i=0; i<cnt; i++ ) 35 { 36 while(x%a[i]==0) 37 { 38 if(flag==0) 39 { 40 flag=1; 41 k++; 42 } 43 x/=a[i]; 44 ds[k]=a[i]; 45 zs[k]++; 46 } 47 if(x==1) break; 48 flag=0; 49 } 50 if( x!=1 )//如果分解完x都不等于1,那么x必定是一个素数 51 { 52 k++; 53 ds[k]=x; 54 zs[k]=1; 55 } 56 return k; 57 } 58 59 int main() 60 { 61 init(); 62 ll x; 63 cin>>x; 64 ll k=fj(x); 65 for(ll i=1;i<=k;i++) printf("%lld^%lld%c",ds[i],zs[i],i==k?‘\n‘:‘+‘); 66 return 0; 67 }
标签:因数分解 相同 cin while mes flag 正整数 ios false
原文地址:https://www.cnblogs.com/wsy107316/p/11600592.html