标签:约数 1087 ansNum int prime mark ++ 九度 ansSize
题目描述:
输入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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。