1. 程式人生 > >HDU-1164-Eddy's research I (分解質因數)

HDU-1164-Eddy's research I (分解質因數)

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 namespace
std; 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 (分解質因數)