【问题标题】:about Sieve of Eratosthenes关于埃拉托色尼筛
【发布时间】:2013-10-11 10:18:23
【问题描述】:

我在使用eratosthenes 的筛子时遇到了一些问题。 所以我从一本名为“Schaum's outlines”的书中得到了筛子的数学计算,但我认为这本书的编程编码错误...... 这是书中的代码:

public class Sieve
{
    final static int P = 800;
    static boolean[] isPrime = new boolean[count];

Sieve();
{
    for (int i = 2; i<P; i++)
    {
        isPrime[i] = true;
    }
    for (int i = 2; i<P/2; i++)
    {
        if (isPrime[i])
        {
            for (int j = 2*i; j<P; j += i)
            {
                isPrime[j] = false;
            }
        }   
    }
}
public static void main(String[] args)
{
    new Sieve();
    print();
}

static void print()  {
    for (int i=0; i<count; i++)
        if (isPrime[i]) System.out.println(i + " ");
        else if (i%90==0) System.out.println();
        System.out.println();
}}

所以是的,由于“Sieve()”无法识别,我使用了代码并做了一些细微的更改。 下面是我的代码:

public class Primenumbers
{
    final static int count = 1000;
    static boolean[] isPrime = new boolean[count];

    public static sieve(int count, boolean isPrime);
    {
        for (int i = 2; i<count; i++)
        {
            isPrime[i] = true;
        }
        for (int i = 2; i<count/2; i++)
        {
            if (isPrime[i])
            {
                for (int j = 2*i; j<count; j += i)
                {
                    isPrime[j] = false;
                }
            }   
        }
    }
    public static void main(String[] args)
    {
        for (int i=0; i<count; i++)
        {
            if (isPrime[i])
            {
                System.out.println(i + " ");
            }
        }
    }
}

那么...我做错了什么? 感谢您的帮助!

【问题讨论】:

  • 有什么问题?编译器错误?运行时异常?输出错误?还有什么?
  • 关于公共静态筛子错误的编译器错误:方法声明无效;需要返回类型
  • 那么编译器的信息还不够清楚吗?您需要为您的 sieve() 方法提供返回类型。
  • 通过删除方法并用静态替换它可以工作,但是为什么你只使用静态没有方法名称或方法类型......你能解释一下吗?

标签: java sieve-of-eratosthenes sieve


【解决方案1】:

我做错了什么?

您已经定义了sieve(),但您从未调用它。您需要在打印之前调用它:

public static void main(String[] args)
{
    sieve(); // <<== Here
    for (int i=0; i<count; i++)
    {
        if (isPrime[i])
        {
            System.out.println(i + " ");
        }
    }
}

它在书中起作用的原因是初始化已经在构造函数中完成。您修改后的代码将初始化移动到一个静态函数中,但它无法调用该初始化。

您还需要从sieve 的声明中删除参数,因为它已经可以访问isPrimecount

另一种方法是完全删除sieve 方法,将其替换为静态初始化程序。而不是

public static sieve() 
{
    // Code to initialize isPrime
}

static
{
    // Code to initialize isPrime
}

此更改使 sieve() 方法成为静态初始化程序,始终在您的类中的其他任何内容执行之前调用。

【讨论】:

  • 好的,我将它添加到 main 方法中,但在编译时仍然出现错误:public static sieve(int count, boolean isPrime);
  • @SteelDevil 顺便说一句,您需要删除方法和构造函数声明中的分号 - 例如,我敢打赌,书中Sieve(); 后面没有分号。
  • 好吧,做到了!但是为什么你只使用静态它作为一种方法呢?你能解释一下吗?
  • 非常感谢您的帮助! + 为你先生或女士或机器人我不知道大声笑:)
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多