模数在不应该的时候改变变量值

Modulus altering variable values when it shouldn't

模数正在改变 primer 的值,因为当我在找到模数之前打印它时,我得到了它的实际值,但在找到模数之后它有时变为零或一。这是一个判断用户输入的数字是否为素数的程序。

#include<stdio.h>
int main(){
int num;
int primer;
int mod;
printf("enter num> ");
scanf("%d", &num);
primer = num-1;
while(primer > 0){
    mod = num%primer;


    if(mod == 0){
        printf("not prime");
        break;}

    if(primer == 1){
        printf("prime");
        break;}
    
    
        primer--;}

}

谨防将问题归咎于语言结构(尤其是定义明确的数学结构)。

问题出在您的代码上。它不做你认为它做的事。您正在尝试使用两种相互竞争的方法来完成您的任务。重来。当您遍历可能的除数时,从 2 开始计数。您的变量名选择对您也没有帮助。

记住,电脑不会帮你解决这个任务。作为一名程序员,你的工作首先是自己解决任务,其次才是告诉计算机如何去做。

问题根本不在于模数,当 primer 达到 1 时 num%primer 的结果为 0,因此满足 if 语句的两个条件看 mod == 0primer == 1 都是 true ,一个简单的 if(mod == 0 && primer != 1) 修复了它。至于 primer 有时是 1 和 0 这也是我愚蠢的典型案例,我在 if 语句中检查它的值,因此该值是它被循环减少后的值。

代码因质数而失败,因为它 primer == 1 然后 mod == 0 为真 - 导致“不是质数”。

mod = num%primer;
if (mod == 0) {
  printf("not prime");
  break;
}

// Too late
if (primer == 1) {
  printf("prime");
  break;
}

代码效率低下,因为它进行 O(num) 次测试。


备选方案,使用奇数进行测试:[3 ... num] 的平方根 - 即 divisor*divisor <= num.

divisor*divisor <= num 重整为 divisor <= num/divisor 以避免溢出。

int isprime(int num) {
  if (num % 2 == 0) {
    return num == 2; // Only even prime
  }
  for (int divisor = 3; divisor <= num/divisor; divisor += 2) {
    if (num%divisor == 0) {
      return 0;
    } 
  }
  // Reach this point when num is a prime or an odd less than 3
  return num >= 3;  
}