【发布时间】:2015-02-11 08:11:00
【问题描述】:
http://www.spoj.com/problems/NDIV/
这是问题陈述。由于我是编程新手,这个特殊的问题让我失望了,我在互联网上找到了这个特殊的代码,当我尝试提交时得到了 AC。我想知道这段代码是如何工作的,因为我是从在线资源提交的,这对初学者来说是个坏主意。
#include <bits/stdc++.h>
using namespace std;
int check[32000];
int prime[10000];
void shieve()
{
for(int i=3;i<=180;i+=2)
{
if(!check[i])
{
for(int j=i*i;j<=32000;j+=i)
check[j]=1;
}
}
prime[0] = 2;
int j=1;
for(int i=3;i<=32000;i+=2)
{
if(!check[i]){
prime[j++]=i;
}
}
}
int main()
{
shieve();
int a,b,n,temp,total=1,res=0;
scanf("%d%d%d",&a,&b,&n);
int count=0,i,j,k;
for(i=a;i<=b;i++)
{
temp=i;
total=1;
k=0;
for(j=prime[k];j*j<=temp;j=prime[++k])
{
count=0;
while(temp%j==0)
{
count++;
temp/=j;
}
total *=count+1;
}
if(temp!=1)
total*=2;
if(total==n)
res++;
}
printf("%d\n",res);
return 0;
}
看起来代码在埃拉托色尼筛上有效,但有些事情我无法理解。
- 为什么数组“check”的限制是32000?
- 为什么数组素数的限制是 10000?
- 在 main 内部,无论 j 的 for 循环内部发生什么。
关于这种方法的困惑太多,有人可以解释一下整个算法是如何工作的。
【问题讨论】:
标签: c++ sieve-of-eratosthenes factors