-
题目描述:
-
输入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;
}