-
题目描述:
-
输入n个整数,依次输出每个数的约数的个数
-
输入:
-
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
-
输出:
-
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
-
样例输入:
-
5 1 3 4 6 12
-
样例输出:
-
1 2 3 4 6
补充:约束个数定理
对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,则n的正约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1) .其中p1,p2,p3,…pk都是n的质因数;a1、a2、a3…ak是p1、p2、p3,…pk的指数。代码:
#include <iostream> #include <string> #include <string.h> #include <map> #include <stdio.h> #include <algorithm> #include <queue> #include <vector> #include <math.h> #include <set> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define SWAP(a , b){ string temp = a; a = b; b = temp;} typedef long long LL; using namespace std; map<int,int>mp; map<int,int>::iterator it; LL k; int calc() { int sum = 1; mp.clear(); LL i; for(i = 2;i*i <= k;i++) { int num = 0; if(k%i == 0) { while(k%i == 0) { num++; k = k/i; } mp[i] = num; } } if(k != 1) mp[k]++;//最后一个质数 for(it = mp.begin();it != mp.end();it++) { sum *= (it->second + 1); } return sum; } int main() { int n; while(scanf("%d",&n) != EOF&&n != 0) { while(n--) { scanf("%ld",&k); printf("%ld\n",calc()); } } return 0; }