【问题标题】:Modulus altering variable values when it shouldn't模数在不应该改变变量值时
【发布时间】:2021-12-22 06:55:01
【问题描述】:

模数正在改变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--;}

}

【问题讨论】:

  • 您输入的是什么值?你看到了什么结果?你期望得到什么结果?
  • 请提供minimal reproducible example -- 缺少while 循环的其余部分。
  • @G.M.我在中编辑了它
  • 请使用一致的可读格式和缩进。 primer--;}}???真的吗?如果你不花时间让你的代码可读,不仅没有其他人读,你也不能读。
  • @AndrewHenle 我刚开始学习,谢谢你的提示,但这只是一个简单的脚本,所以我认为没有必要很好地格式化它

标签: c variables while-loop modulo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    代码与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 &lt;= num

    divisor*divisor &lt;= num 改写为divisor &lt;= 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;  
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 别自称傻。记住,在你学会之前没有什么是显而易见的。 ;-)
      猜你喜欢
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2012-11-24
      相关资源
      最近更新 更多