如果条件是模数,逻辑条件不正确?

时间:2014-01-15 18:21:27

标签: 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);
} 

4 个答案:

答案 0 :(得分:2)

条件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除以得到简化形式的分数。

答案 1 :(得分:1)

即使只有(!(a%2 && b%2))a%2中的一个成立,

b%2也会生效。

看一下以下示例:

3/4 - &gt; a%2 == 0,b%2 == 1 - &gt; (a%2&amp;&amp; b%2)== 0 - &gt; (!(%2&amp;&amp; b%2))== 1

您正在寻找(a%2 == 0 && b%2 == 0)而非您的条件,以及其他条件。

答案 2 :(得分:1)

“接受答案后”答案。

这并没有像@Adam Rosenfield那样详细解释OP代码的问题,但确实解决了“我想检查一个分数2 4(例如)是否可以简化为1 2 !!”的更大OP期望。以一般方式。

使用欧几里得算法找到最大公分母,然后用它除a,b。无需生成素数列表。很快。

// Euclidean Algorithm
unsigned gcd(unsigned a, unsigned b) {
  while (b != 0) {
    int t = b;
    b = a % b;
    a = t;
  }
  return a;
}

#include <stdio.h>
int main() {
  int a, b;
  for (;;) {
    printf("\nInput positive fraction like 12/30: ");
    if (scanf("%u/%u", &a, &b) != 2)
      break;
    unsigned g = gcd(a, b);
    a /= g;
    b /= g;
    printf("Simplified Fraction is %u/%u", a, b);
  }
  return 0;
}

答案 3 :(得分:0)

除了其他人识别的逻辑或问题之外,您还有一个带有while条件的无限循环。您不需要(或想要)循环使用当前代码。试试这个

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

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

带有您给定输入的输出

Input integers for fraction:2 4
Simplified Fraction is 1/2

Input integers for fraction:8 24
Simplified Fraction is 1/3