【问题标题】:How to find the nth prime in C如何在C中找到第n个素数
【发布时间】:2014-10-20 02:42:53
【问题描述】:

此应用程序将收到一个号码n。收到这个数字后,程序必须在素数列表中显示n-th 素数。例如,如果用户输入3,程序应该显示5,因为5 是从2 开始的第三个素数。我知道我的代码有问题,但我不知道问题出在哪里以及如何解决。

#include <stdio.h>

int main() {
    int n, i, flag, prime;
    int counter = 1;
    scanf("%d", &n);
    if (n == 1) prime = 2;
    else
        do{
            prime = 3;
            for (i = 2; i < prime; i++) {
                flag = 1;
                if (prime % i == 0) {
                    flag = 0;
                }
            }
            if (flag == 1)
                counter++;
            prime++;
        } while (counter != n);
    if (counter == n)
    printf("%d\n", prime);
    return 0;
}

【问题讨论】:

  • 你必须描述为什么你认为这段代码是错误的。具体来说,解释它打印什么输出,你期望什么以及你认为为什么会发生这种情况。仅仅做一个这样的练习很可能会给你一个答案。
  • 不知道你是否关心,但使用筛算法(eratosthenes 或 atkins)会显着加快你的函数,以处理更大的数字。
  • 这段代码很短而且相当简单,n=3 的情况不会运行很长时间;您应该能够在纸上或在printf 语句的帮助下逐步完成它,并确切了解它是如何出错的。
  • 例如标准输入:3 标准输出:5 我的输入:3 我的输出:4 Whaterer I input except 1, it prints 4...

标签: c


【解决方案1】:

像这样修复您的保单剩余样本:

#include<stdio.h>

int main(void){
    int n, i, flag, prime;
    int counter = 1;

    scanf("%d", &n);
    if (n == 1)
        prime = 2;
    else {
        prime = 1;
        do{
            prime += 2;
            flag = 1;
            for (i = 3; i < prime; i+=2){
                if (prime % i == 0) {
                    flag = 0;
                    break;
                }
            }
            if(flag == 1)
                counter++;
        } while (counter != n);
    }
    printf("%d\n", prime);

    return 0;
}

【讨论】:

  • 非常感谢!而且你分享的算法要好得多!
【解决方案2】:

您每次循环都将 flag 重置为 1,因此“flag”只会告诉您 prime 是否可以被“prime-1”整除,当然它永远不会。

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多