计算素数;程序工作/崩溃超过 6657;

Posted

技术标签:

【中文标题】计算素数;程序工作/崩溃超过 6657;【英文标题】:Calculating primes; Program works/Crashes past 6657; 【发布时间】:2014-04-12 22:57:46 【问题描述】:

我正在尝试通过编写一个计算素数直到特定数字的程序来自学一些 CPP。我在带有第三代 i5@2.8GHz(x4) 的笔记本电脑上使用 Visual Studio Express 2013,在 Win 8.1 Pro(x64) 上具有 8GB RAM。我是 cpp 的新手(可能很明显),但我希望让这个程序能够工作超过 6657 甚至更高。任何想法将不胜感激!

编辑:这是程序的新版本按预期工作并使用向量。谢谢你的帮助!

/*
* Prime finder, starts at 2 works up, was working initially
* to 6658, now can run to 150000(highest tested yet) in ~17m25s.
* May need optimization. Uses vector size to check for nth number.
* Must have #include <vector>
*/

std::vector<int> prime;  // required for program to work. 
int primes(unsigned y)
    using namespace std;
    unsigned b = 0;
    bool z = true; prime.push_back(2);
    for (b = 2; prime.size() <= y; b++)
        if (b % 2 == 0 && b < y) b++; //catches even numbers.
        //finds primes to the nth integer
                /*decrementing in this loop produced a strange
                 *end count, used increments instead counts fixed
                 *and program completes sooner.
                 */

            for (unsigned j = 2; j < prime.size(); j++)
                //if (j > y) return 0; //catches infinite loop                
                if (prime.at(j) >= (b/2))
                    //removes unneccessary checking
                break;
                if (b%prime.at(j) == 0)
                z = false; j = prime.size();
            
            if (z == true) prime.push_back(b); 
            z = true;
        
    return 0;

【问题讨论】:

数组索引越界:使用已经实现的数据结构,如vector。 【参考方案1】:

这一行

int prime[] = 0;// 程序运行所必需的。必须初始化。

为恰好一个素数创建空间。

因此,当您对 j &gt; 1prime[a](其中 a &gt; 1)的值执行 prime[1]prime[j-1] 时,您将超出数组的范围。

您需要:

    使用vector&lt;int&gt; primeprime.push_back(i); 使用int prime[SOMENUMBER] = 0 ;

使用vector&lt;int&gt; 的另一个好处是您不需要将prime[0] 与素数的数量一起存储。相反,您有一个 prime.size() 函数,它告诉您有多少元素。

【讨论】:

我以前研究过矢量,但我在使用它们时遇到了问题,网站解释它并显示语法的方式。从那以后,我使用方法 2 来使程序正常工作,而且确实如此。感谢您的帮助。话虽如此,一旦我学会了如何使用向量,我可能会重写它。我不知道数组大小需要保持不变。如果我在第 n 个数字之后,向量听起来像是我需要走的路。绝对信息丰富。【参考方案2】:
int prime[] = 0;

该数组的大小仅为 1,但您稍后会处理更大的索引。这不应该适用于零以外的任何其他值,但由于某种原因你很幸运。尝试增加数组大小或使用动态数组。

【讨论】:

以上是关于计算素数;程序工作/崩溃超过 6657;的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala 中计算素数:这段代码是如何工作的?

如何计算崩溃的“成本”? [关闭]

使用BitArray判断素数

1007. 素数对猜想 (20)

UVa 12716 && UVaLive 6657 GCD XOR (数论)

1007 素数对猜想