1-3:最多約數問題
阿新 • • 發佈:2018-11-10
最多約數問題。正整數x 的約數是能整除x的正整數,其約數的個數記為div(x),例如div(10)=4。設a 和b 是兩個正整數,找出a 和b 之間約數個數最多的數x 的約數個數。
樣例輸入:
1 36
樣例輸出:
9
這道題有個數學上的知識,就是:一個合數的約數個數等於它所有質因數的次方加上一再相乘。
即:x=n1^m1+n2^m2+...+nn^mn(x為合數,n1...nn為其質因數,m1...mn為對應於其質因數的次方數),x的約數個數為:(m1+1)*(m2+1)*(m3+1)*...*(mn+1)
那麼根據這個思想,程式碼的實現如下:
#include <bits/stdc++.h> using namespace std; int vis[100] = {0}; int prim[100]; int cnt=0; void IsPrimm() { int i,j; for( i=2; i<100; i++) { if(vis[i] == 0) { for(j=i*2; j<100; j+=i ) { vis[j] = 1; } } } for(i=2; i<100; i++) { if(vis[i] == 0) prim[cnt++] = i; } } int f(int n) { int i,t=1,k=0; for(i=0; i<cnt && prim[i]<=n;i++) { if(n%prim[i] == 0) { k=0; while(n%prim[i] == 0) { k++; n = n/prim[i]; } t = t*(k+1); } } return t; } int main() { IsPrimm(); //先求0~100所有素數 int i,a,b,maxx = 0; cin>>a>>b; for(i=a; i<=b; i++) { if(f(i) > maxx) maxx = f(i); } cout<<maxx<<endl; return 0; }