HDU-1164-Eddy's research I (分解質因數)
阿新 • • 發佈:2018-09-25
clu 質因子 pac amp hdu 因數 由於 方法 快速
由於這道題目數據範圍小,所以屬於水題。可以采取暴力的做法來解決。
代碼如下:
#include"bits/stdc++.h" using namespace std; const int maxn=65535; bool tag[maxn+5]; vector<int>v;int n; bool judge(int m){ while(n%m==0){ if(n==m){ printf("%d\n",m); return true; } else printf("%d*",m); n/=m; } return false; } int main(){ for(int i=2;i<=maxn;i++){ if(!tag[i])v.push_back(i); for(int j=i<<1;j<=maxn;j+=i) tag[j]=true; } while(~scanf("%d",&n)){ for(int i=0;i<v.size();i++) if(n%v[i]==0&&judge(v[i]))break; } return 0; }
但是如果把這題的數據範圍加到1e8,那麽用這種暴力的方法光是打一個素數表都很耗時。如何快速解決1e8的因式分解呢?可以這樣想:
1e8以內的數大於1e4的質因子最多只能出現一次(因為1e4的平方等於1e8,所以如果出現一次以上就會超過1e8),而且如果這個數出現了大於1e4的質因子,那麽當我們把小於1e4的質因子都除盡時,留下的就是這個大於1e4的質因子。所以我們打素數表時其實不用打到1e8,只要1e4就夠了(如果範圍是n就打到根號n),這樣可以加速了1e4倍。
代碼如下:
#include"bits/stdc++.h" using namespacestd; const int maxn=1e4; bool tag[maxn+5]; vector<int>v;int n; bool judge(int m){ while(n%m==0){ if(n==m) return true; else printf("%d*",m); n/=m; } return false; } int main(){ for(int i=2;i<=maxn;i++){ if(!tag[i])v.push_back(i); for(int j=i<<1;j<=maxn;j+=i) tag[j]=true; } while(~scanf("%d",&n)){ for(int i=0;i<v.size();i++) if(n%v[i]==0&&judge(v[i])) break; printf("%d\n",n); } return 0; }
對於這一題65535的範圍maxn只要設為256就夠了,其他基本沒有改動
HDU-1164-Eddy's research I (分解質因數)