我在这里写的程序遇到了一些问题。 它应该打印下一个给定值的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;
}
我决定不删除这篇文章。我相信有一天会有人发现它很有用。
答案 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++;
}
}