如何排除0,1。作素数判断

我想要在排除0,1的情况下,用便利法判断是否为素数。 代码在输入2,3,4时 出错,这个错在哪里? 想1个小时了

#include <stdio.h>
int main ( ) //int argc; const char *argv[] 
{//素数:只能被1和自身整除
int i,x;
   printf("输入一个数字,我告诉你它是否为素数:  ");
    scanf("%d",&x); 
    printf(" \n  ");
    printf("       输入-1结束程序。  ");
    
    while (x!=-1)//输入-1结束程序
    {
      
       int isPrime=0 ;//1代表是素数。

if (x>1)
{
for(i=2;i<x-1;i++) {
    if(x%i==0) {
        isPrime = 0;
      continue; //忘记跳出了,耽误半小时
    }else{
        isPrime=1;
    }

}
  /* code */
}else{
   goto lol;

}

 lol:
if(isPrime==1){
    printf("是素数\n");
} else {
    printf("不是素数\n");
} 

printf("输入一个数字,我告诉你它是否为素数:  ");
    scanf("%d",&x); 
    printf(" \n  ");
    printf("       输入-1结束程序。  ");

        /* code */
 
     }
  
return 0;
}

结果如下:

img

“Devil组”引证GPT后的撰写:
主要是在判断素数的逻辑上存在一些错误。以下是修改后的代码:

#include <stdio.h>

int main() {
    int x;
    printf("输入一个数字,我告诉你它是否为素数:");
    scanf("%d", &x);
    printf("\n输入-1结束程序。\n");
    
    while (x != -1) {
        int isPrime = 1; // 1代表是素数,0代表不是素数。

        if (x <= 1) {
            isPrime = 0; // 负数、0、1都不是素数。
        } else {
            for (int i = 2; i < x; i++) {
                if (x % i == 0) {
                    isPrime = 0; // 只要有一个数能整除x,那么x就不是素数。
                    break; // 找到一个因子就可以跳出循环了。
                }
            }
        }

        if (isPrime == 1) {
            printf("%d是素数\n", x);
        } else {
            printf("%d不是素数\n", x);
        }

        printf("输入一个数字,我告诉你它是否为素数:");
        scanf("%d", &x);
        printf("\n输入-1结束程序。\n");
    }

    return 0;
}


修改后的代码,在判断素数的逻辑上做了如下改动:

将isPrime的初始值设置为1,表示假设这个数字是素数。如果在后面的循环中发现可以被整除,则将其设置为0。

在判断素数的循环中,将循环的终止条件改为i < x。因为在判断x是否是素数时,只需要从2开始到x-1的所有数中去判断,如果有一个数能整除x,那么x就不是素数。

在判断素数的循环中,加入了break语句。因为如果找到一个因子能够整除x,那么后面的循环就没有必要继续执行了,可以立即跳出循环。

逻辑上有些问题,我们应该先假设他是素数,isPrime = 1,然后,当有整除因子的时候 isPrime = 0,然后跳出

#include <stdio.h>
int main ( ) //int argc; const char *argv[] 
{//素数:只能被1和自身整除
    int i,x;
    printf("输入一个数字,我告诉你它是否为素数:  ");
    scanf("%d",&x); 
    printf(" \n  ");
    printf("       输入-1结束程序。  ");
    while (x!=-1)
    {
        int isPrime=1 ;//1代表是素数。
        if (x>1)
        {
            for(i=2;i<x-1;i++) {
                if(x%i==0) {
                    isPrime = 0;
                    //continue; //忘记跳出了,耽误半小时
                    break; // 是终止循环跳出,不是 continue 继续
                }
            }
        /* code */
        }else{
            isPrime = 0;
        }

        lol:
        if(isPrime==1){
            printf("是素数\n");
        } else {
            printf("不是素数\n");
        } 
        printf("输入一个数字,我告诉你它是否为素数:  ");
        scanf("%d",&x); 
        printf(" \n  ");
        printf("       输入-1结束程序。  ");
        /* code */

    }
    return 0;
}

你想排除什么,加个if判断不就得了
实际上,只要是小于2的数,不管是0,1还是负数,都既不是素数也不是合数

太乱了

int isprime = 1;
for(i=2;i<x-1;i++) 
{
    if(x%i==0) {
        isPrime = 0;
        break;
    }
}

if(isPrime==1){
    printf("是素数\n");
} else {
    printf("不是素数\n");
}

  • 参考GPT的内容和自己的思路:

  • 您的程序有以下问题:

  • 在判断素数时,只要发现一个因子就判断不是素数,但这种情况不一定正确。例如,当x=9时,只有因子3,但它仍然不是素数。正确的做法应该是在循环结束后再进行判断。
  • 当输入2时,程序会输出“不是素数”,这是因为您没有考虑到输入值等于2时的情况。
  • 下面是一个修正后的代码,可以在排除0和1的情况下判断素数:
#include <stdio.h>

int main()
{
    int x;

    printf("输入一个数字,我告诉你它是否为素数:");
    scanf("%d", &x);

    while (x != -1)
    {
        int isPrime = 1;

        if (x > 2)
        {
            for (int i = 2; i <= x / 2; i++)
            {
                if (x % i == 0)
                {
                    isPrime = 0;
                    break;
                }
            }
        }
        else if (x == 2)
        {
            isPrime = 1;
        }
        else
        {
            isPrime = 0;
        }

        if (isPrime == 1)
        {
            printf("%d是素数\n", x);
        }
        else
        {
            printf("%d不是素数\n", x);
        }

        printf("输入一个数字,我告诉你它是否为素数:");
        scanf("%d", &x);
    }

    return 0;
}


  • 在这个代码中,我们首先判断输入值是否大于2,如果大于2则进行循环判断。我们在循环中判断x是否能被2到x/2之间的整数整除,如果能则不是素数,否则就是素数。如果x等于2,则是素数;如果x小于2,则不是素数。另外,我们使用break语句来提前退出循环,这样可以提高程序效率。