C - 接下来的10个素数

时间:2015-09-19 05:41:09

标签: c

我在这里写的程序遇到了一些问题。 它应该打印下一个给定值的10个素数 - 当然,它不起作用。我的逻辑是错误的。

例如,如果程序读取数字:

2 

它应该打印:

3, 5, 7, 11, 13, 17, 19, 23, 29, 31

代码:

#include <stdio.h>

int main() {
    int n, i, count, primenumber = 1; // primenumber is a flag
    printf("Insert a number:\n");
    scanf("%d", &n);
    for (count = 0, n++; count < 10; n++, count++ ) {
        for (i = 2; i < n; i++) {
            if (n % i == 0) {
                primenumber = 0;
                break;
            }
        }
        if (primenumber)
            printf("%d\n", n);
    }
    return 0;
}

如果有人要解决这个问题,我将非常感激。

感谢。

== UPDATE ==

我做到了!

关键的变化是primenumber标志。我将其插入while内,始终设置为1。如果设置在while之外,则该标志永远不会重置,并且不会进行进一步的测试 - 具体取决于您在提示时给出的数字。

这是更新的功能代码:

#include <stdio.h>

int main() {
    int n, i, count = 0, primenumber; 
    printf("Insert a number: ");
    scanf("%d", &n);
    n++; // we do not want to print the prompted number
    while (count < 10) {
        primenumber = 1; // primenumber is set as flag
        for (i = 2; i < n / 2; i++) {
            if (n % i == 0) {
                primenumber = 0;
                break;
            }
        }
        if (primenumber) {
            printf("%d\n", n);
            count++; // increment count only when prime
        }
    n++;
    }
    return 0;
}

我决定不删除这篇文章。我相信有一天会有人发现它很有用。

2 个答案:

答案 0 :(得分:3)

这是您修改后的工作代码。 在每个步骤中,您应该重新初始化primenumber=1,否则它只给出一个数字。当你发现素数时,count也应该增加。

#include <stdio.h>

int main() {
    int n, i, count, primenumber = 1; // primenumber is a flag
    printf("Insert a number:\n");
    scanf("%d", &n);
    for (count = 0, n++; count < 10; n++ ) {
        primenumber = 1;
        for (i = 2; i < n; i++) {
            if (n % i == 0) {
                primenumber = 0;
                break;
            }
        }
        if (primenumber){
            count++;
            printf("%d\n", n);
        }

    }
    return 0;
}

答案 1 :(得分:1)

这是一种减少处理时间的解决方案,通常用于较大的n:

#include <stdio.h>
#include <math.h>
int main() {
int n, i, count= 1, primenumber = 1, root; // primenumber is a flag
printf("Insert a number:\n");
scanf("%d", &n);
n++;
while(count!=11)
{
 root= sqrt(n);//You only need to check for range 2 to square root of number. This is the key ingredient of the code to reduce time complexity 
 primenumber = 1;
 for(i=2; i<= root; i++)
    {
    if(n%i==0)//As soon as it finds a number which perfectly divides it, break from loop checking n's nature
        {
        primenumber = 0;
        break;
        }       
    }
    if(primenumber==1)
        {
        printf("%d \t", n);
        count++;
        }
    n++;                
}
}