求約數個數問題
阿新 • • 發佈:2019-02-14
- 題目描述:
-
輸入n個整數,依次輸出每個數的約數的個數
- 輸入:
-
輸入的第一行為N,即陣列的個數(N<=1000)
接下來的1行包括N個整數,其中每個數的範圍為(1<=Num<=1000000000)
當N=0時輸入結束。
- 輸出:
-
可能有多組輸入資料,對於每組輸入資料,
輸出N行,其中每一行對應上面的一個數的約數的個數。
- 樣例輸入:
-
5 1 3 4 6 12
樣例輸出:1 2 3 4 6
//別人的程式碼
#include<iostream> #include<map> using namespace std; int prime[3500]={2},P=1,N,Num; map<int,int> divisor; map<int,int>::iterator it; int isPrime(int N){ if(N % 3==0) return N==3; for(int i=1;prime[i]*prime[i]<=N;++i) if( N % prime[i]==0) return 0; return 1; } int divNum(int Num){ for(int i=0;prime[i]<=Num && i<P;++i) while( Num % prime[i] == 0 ){ divisor[prime[i]]++; Num /= prime[i]; } if(Num!=1) divisor[Num]=1; int result=1; for(it=divisor.begin();it!=divisor.end();++it) result *= (it->second + 1); divisor.clear(); return result; } int main(){ for(int i=3;i<=31627;i+=2) if(isPrime(i)) prime[P++]=i; while(cin>>N) while(N--){ cin>>Num; cout<<divNum(Num)<<endl; } }
#include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> using namespace std; struct node { int n; int num; }; node prim[200000]; bool prime(int n) { if(n <= 1) return false; if(n == 2) return true; int len = int(sqrt(n) + 0.5); for(int i=2; i<=len; i++) if(n % i == 0) return false; return true; } void init() { int num = 0; for(int i=2; i<= 1000000; i++) if(prime(i)) prim[num++].n = i; } int n_pr(int n) { int i, k =1; for(i=0; n != 1;i++) { if(n % prim[i].n == 0) prim[i].num = 1; while( n % prim[i].n == 0) { prim[i].num ++; n /= prim[i].n; } if(prim[i].num != 0) k *= prim[i].num; } return k; } int main() { init(); int n, m; while(~scanf("%d", &n)) { while(n--) { scanf("%d", &m); for(int i=0; i<m; i++) prim[i].num = 0; printf("%d\n", n_pr(m)); } } system("pause"); return 0; }