【问题标题】:How is this code working for finding the number of divisors of a number?此代码如何用于查找数字的除数?
【发布时间】: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;
}

看起来代码在埃拉托色尼筛上有效,但有些事情我无法理解。

  1. 为什么数组“check”的限制是32000?
  2. 为什么数组素数的限制是 10000?
  3. 在 main 内部,无论 j 的 for 循环内部发生什么。

关于这种方法的困惑太多,有人可以解释一下整个算法是如何工作的。

【问题讨论】:

    标签: c++ sieve-of-eratosthenes factors


    【解决方案1】:
    1. 设置阵列的硬性限制可能是因为问题要求如此?如果不是那么只是糟糕的代码。

    2. 在内部循环中,您正在计算除以数字的素数的最大幂。为什么?见第 3 点。

    3. 一个数n的因数个数可以计算如下:

      设 n = (p1)^(n1) * (p2)^(n2) ... 其中 p1, p2 是质数,n1, n2 ... 是它们的指数。那么n的因子个数 = (n1 + 1)*(n2 + 1)...

      因此total *= count + 1 这基本上是total = total * (count + 1)(其中count 是除以原始数的素数的最大指数)计算该数的素因数的数量。

    是的,该代码实现了 Eratosthenes 筛,用于将素数存储在表中。

    (Edit 刚刚看到问题 - 您至少需要 10^4 boolean 值来存储素数(您实际上不需要存储值,只是一个指示是否值是否为质数)。给出的条件是 0 &lt;= b - a &lt;= 10^4 ,因此从a 到b 开始循环并检查存储在数组中的bool 值是否为质数。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2021-03-09
      • 1970-01-01
      • 2018-04-06
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多