c - 如果条件为模,则逻辑条件失败?

标签 c algorithm if-statement modulo fractions

我想检查分数 2 4(例如)是否可以简化为 1 2!!
然而逻辑条件失败。

#include <stdio.h>
int main()
{
  int a,b,live=1;
  printf("\n\nInput integers for fraction:");
  scanf(" %d%d",&a,&b);
  while(live){  
        if(!(a%2 && b%2)){
            a/=2;
            b/=2;
        }else if(!(a%3 && b%3)){
            a/=3;
            b/=3;
        }else if(!(a%5 && b%5)){
            a/=5;
            b/=5;
        }else if(!(a%7 && b%7)){
            a/=7;
            b/=7;
        }else live--;

   }
   printf("Simplified Fraction is %d/%d",a,b);
} 

最佳答案

条件a%2相当于a%2 != 0,即它测试a是否 可被 2 整除。来自 De Morgan's Laws ,条件 if(!(a%2 && b%2)) 相当于 if(!(a%2) || !(b%2))if((a%2 == 0) || (b%2 == 0)),这不是您想要的。

您确实想测试 if((a%2 == 0) && (b%2 == 0)) -- 也就是说,如果两者都是能被 2 整除,而不是如果其中一个能被 2 整除。这样写也不会那么困惑。

而且很明显,为了简化任何分数,您需要测试所有可能的质因数,而这对于有限数量的 if 语句来说是不可能做到的。建议的方法是使用 Euclidean algorithm确定分子和分母的最大公约数,然后将它们除以 GCD 以获得简化形式的分数。

关于c - 如果条件为模,则逻辑条件失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145313/

相关文章:

Char 和 int16 数组元素都显示为 32 位十六进制?

algorithm - 了解归并排序算法

java - 为什么我的 for 循环只返回 JTable 中的第一个值?

c - 尽快检测变量变化

c - 从 float 和 double 中读取一个文件?

c - fgets 和 sscanf 两次获取列表值

javascript - 如何检测用户是否使用 canvas 和 javascript 在触摸设备上画了一个圆圈?

c# - 使用 DI 添加用于使用 2 个数字进行计算的新方程式

c# - IF 是否比 IF-ELSE 表现更好?

bash - 一个简单的 'if' 语句