我想检查一个分数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);
}
答案 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