您的位置:首页 > 其它

[WA]题目1087:约数的个数

2013-08-10 23:18 232 查看
题目描述:

输入n个整数,依次输出每个数的约数的个数

输入:

输入的第一行为N,即数组的个数(N<=1000)

接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)

当N=0时输入结束。

输出:

可能有多组输入数据,对于每组输入数据,

输出N行,其中每一行对应上面的一个数的约数的个数。

样例输入:
5
1 3 4 6 12


样例输出:
1
2
3
4
6

代码:

#include <stdio.h>
int num[1001];
bool mark[32000];
int prime[32000];
int primeSize;
void init() {
primeSize = 0;
int i;
for(i=0;i<32000;i++)
mark[i] = false;
for(i=2;i<32000;i++) {
if(mark[i]) continue;
prime[primeSize++] = i;
int j;
for(j=i*i;j<32000;j+=i)
mark[j] = true;
}
}
int cnt[32000];
int ncd(int x) {
int i;
for(i=0;i<primeSize;i++)
cnt[i] = 0;
for(i=0;i<primeSize;i++) {
while(x%prime[i]==0) {
cnt[i]++;
x /= prime[i];
}
}
int ans = 1;
for(i=0;i<primeSize;i++) {
if(cnt[i]!=0)
ans *= (cnt[i] + 1);
}
return ans;
}

int main() {
int n;
init();
while(scanf("%d",&n)!=EOF) {
if(n==0) break;
int i;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int j;
for(j=0;j<i;j++) {
int ans = ncd(num[j]);
printf("%d\n",ans);
}
}
return 0;
}


在自己机器上测试正常,提交后WA。不知道为什么???????????

本题利用了约数个数定理。约数个数定理(百度百科)。



因此只需对n进行分解素因数,再求出每个素因数所对应的幂指数,最后利用定理得出结果。

AC的代码:

#include <stdio.h>
#include <math.h>
int num[1001];
int ncd(int x) {
double bound = sqrt(x);
int i;
int count = 0;
for(i=1;i<bound;i++) {
if(x%i==0)
count += 2;
}
int a = sqrt(x);
if(a*a == x)
count++;
return count;
}
int main() {
int n,i;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++)
scanf("%d",&num[i]);
for(i=0;i<n;i++) {
int ans = ncd(num[i]);
printf("%d\n",ans);
}
}
return 0;
}


count += 2

1.函数ncd中,for循环的判断条件i<sqrt(x)。  sqrt(x)为浮点数,有小数位,所以1 < sqrt(2)

2.只需判断前一半即sqrt(x)之前的数,每次+2

3.最后对于有些数最后还是要+1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: