九度OJ题目1087-约数的个数
作者:互联网
题目描述:
输入n个整数,依次输出每个数的约数的个数
输入:
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出:
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入:
5
1 3 4 6 12
样例输出:
1
2
3
4
6
参考代码:
#include<cstdio>
#include<iostream>
using namespace std;
#define N 100000
#define M 1001
//n最多只存在一个大于sqrt(n)的质因数
int prime[N];
int primeSize;
bool mark[N];
void init() {
memset(mark, false, sizeof mark);
primeSize = 0;
for (int i = 2; i < N; i++) {
if (mark[i] == true) continue;
prime[primeSize++] = i;
if (i >= 1000) continue;
for (int j = i*i; j < N; j += i)
mark[j] = true;
}
}
int count(int x) {
int ansPrime[30];//分解的质因数
int ansSize = 0;
int ansNum[30];//相对应质因数的幂
for (int i = 0; i < primeSize; i++) {
if (x%prime[i] == 0) {
ansPrime[ansSize] = prime[i];
ansNum[ansSize] = 0;
while (x%prime[i] == 0) {
ansNum[ansSize]++;
x /= prime[i];
}
ansSize++;
if (x == 1) break;
}
}
if (x != 1) {
ansPrime[ansSize] = x;
ansNum[ansSize++] = 1;
}
int ans = 1;//约数的个数
for (int i = 0; i < ansSize; i++) {
ans *= ansNum[i] + 1;
}
return ans;
}
int buf[M];
int main() {
int n;
init();
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &buf[i]);
}
for (int i = 0; i < n; i++) {
printf("%d\n", count(buf[i]));
}
}
return 0;
}
标签:约数,1087,ansNum,int,prime,mark,++,九度,ansSize 来源: https://blog.csdn.net/sinat_38292108/article/details/88295880