素数计划

Nek*_*lux 2 c++ primes

我正在尝试一些问题,只是为了练习我的编程技巧.(没有把它带到学校或其他任何东西,自学)我遇到了这个问题,要求我从给定的txt文件中读取一个数字.这个数字是N.现在我想找到N <= 10 000的第N个素数.在找到之后,我想把它打印到另一个txt文件.现在对于问题的大部分内容,我能够理解并设计一种方法来获得N.问题是我使用数组来保存以前找到的素数,以便用它们来检查未来的数字.即使我的数组大小为100,只要输入整数大约<15,程序就会崩溃.

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;

int main() {
    ifstream trial;
    trial.open("C:\\Users\\User\\Documents\\trial.txt");
    int prime;
    trial >> prime;
    ofstream write;
    write.open("C:\\Users\\User\\Documents\\answer.txt");
    int num[100], b, c, e;
    bool check;
    b = 0;
    switch (prime) {
        case 1:
        {
            write << 2 << endl;
            break;
        }
        case 2:
        {
            write << 3 << endl;
            break;
        }
        case 3:
        {
            write << 5 << endl;
            break;
        }
        case 4:
        {
            write << 7 << endl;
            break;
        }
        default:
        {
            for (int a = 10; a <= 1000000; a++) {
                check = false;
                if (((a % 2) != 0) && ((a % 3) != 0) && ((a % 5) != 0) && ((a % 7) != 0)) // first filter
                {
                    for (int d = 0; d <= b; d++) {
                        c = num[d];
                        if ((a % c) == 0) {
                            check = true; // second filter based on previous recorded primes in array
                            break;
                        }

                    }
                    if (!check) {
                        e = a;
                        if (b <= 100) {
                            num[b] = a;
                        }

                        b = b + 1;
                    }
                }
                if ((b) == (prime - 4)) {
                    write << e << endl;
                    break;
                }
            }
        }
    }
    trial.close();
    write.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我这完全基于我的假人指南和我自己这样做,所以请原谅我的算法的一些代码效率低下和一般新手.此外,对于最多15个,它会正确显示素数.

谁能告诉我如何改进当前的代码呢?我正在考虑使用txt文件代替数组.那可能吗?任何帮助表示赞赏.

Pol*_*ker 16

既然你的问题是编程而不是数学,我会尽力保持我的答案.

第一眼看到你的代码让我想知道你到底在做什么......如果你读到了答案,你会发现其中一些人并不愿意理解你的代码,有些人只是把你的代码转储到调试器看看发生了什么.难道我们不耐烦吗?或者仅仅是因为相对容易的问题,您的代码难以理解?

要改进代码,请尝试自问一些问题:

  1. 什么是a,b,c,等?提供更有意义的名字不是更好吗?
  2. 你的算法究竟是什么?你能用英文写下一个清楚写的段落,说明你在做什么(以一种确切的方式)?您是否可以将段落修改为一系列步骤,您可以在任何输入上进行精神上的操作,并确保它是正确的?
  3. 所有步骤都必要吗?我们可以结合甚至消除其中的一些吗?
  4. 有哪些步骤易于用英语表达,但需要比如C/C++中的10行?
  5. 您的步骤列表是否有任何结构?循环?大的(可能是重复的)块可以作为一个步骤与子步骤放在一起?

在完成问题之后,您可能会有一个清晰的伪代码来解决问题,这很容易解释和理解.之后,您可以在C/C++中实现伪代码,或者实际上是任何通用语言.