2014-01-15 2 views
2

Я хотел проверить, можно ли упростить до 2 2 (например) до 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); 
} 
+0

Может быть, вы хотите '% 2 == 0 ...' –

+0

Могли бы сделать 'в то время как ((а% 2 == 0) && (б% 2 == 0)) {а/= 2; б/= 2; } while ((a% 3 == 0) && (b% 3 == 0)) {a/= 3; б/= 3; } ... '. Теперь все настройки для вызова функции. – chux

ответ

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, чтобы получить дроби в уменьшенной форме.

+0

Я сделал это if ((a% 2 == 0) && (b% 2 == 0)), он компилируется, но при вставке 2 4 он держится там, не двигаясь дальше. – hitter

+0

Правда, этот метод лучше всего, но все его простые фракции здесь 7/5, 18/10, 2/4 (некоторые проверки должны быть достаточными?) – hitter

+2

@niCk Серьезно другое 'if()' s нуждается в том же самом обновлении. '} else if ((a% 3 == 0) && (b% 3 == 0)) {' и т. д. – chux

1

(!(a%2 && b%2)) даст справедливо, даже если имеет место только одно из a%2 или b%2.

Посмотрите на следующий пример:

3/4 -> а% 2 == 0, б% 2 == 1 -> (а% 2 & & б% 2) == 0 - > (! (а% 2 & & б% 2)) == 1

Вы ищете (a%2 == 0 && b%2 == 0) вместо вашего состояния, а так же для других условий.

+0

Я использовал это, но по какой-то причине, он остается навсегда! – hitter

+0

@niCk Вы отделяете свои номера пробелом? – cup

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 
+0

'||' а не '&&'? И что, если 12 24? – chux

+0

ok не могли бы вы попробовать 4 8? Мне любопытно, если результат 1 2 или 2 4 !? – hitter

+0

Вам нужно будет это проверить, на данный момент это даст вам 2 4. –

1

An "после принятого ответа" ответа.

Это не детализирует проблемы с кодом OP, как @Adam Rosenfield, но затрагивает большее желание OP: «Я хотел проверить, можно ли упростить дочку 2 4 (например) до 1 2!» в общий способ.

Используйте Евклидовой алгоритм, чтобы найти наибольший общий знаменатель, а затем разделите его на 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; 
} 
Смежные вопросы