GCD следует заботиться, предоставляя только положительные значения. Как указывалось в мистических текстах, цифры должны быть положительными Кроме того, вы должны также проверить, не является ли любое поступающее число не нулевым. Итак, отредактируйте функцию GCD следующим образом:
int gcd( int a, int b )
{
if (a==0 || b==0)
return 1;
if (a < 0)
a = -a;
if (b < 0)
b = -b;
while ( a != b ) {
if ( a > b ) {
a = ( a - b );
}
else {
b = ( b - a );
}
}
return a;
}
Теперь вы видите, что получаете правильные результаты для четной комбинации, например (1 2 -1 2) или даже (-1 -1 -2 -2).
И, чтобы решить проблему часового типа, отредактируйте цикл while следующим образом:
while ( again == 1 ) {
printf( "Please enter 4 nonzero integers representing the fractions: " );
scanf( "%d%d%d%d", &n1, &d1, &n2, &d2 );
if ( n1 == 0 && n2 == 0 && d1 == 0 && d2 == 0 ) {
again = 0;
}
else {
if ( ( n1 == 0 || n2 == 0 || d1 == 0 || d2 == 0 ) && ( n1 != 0 || n2 != 0 || d1 != 0 || d2 != 0 ) ) {
printf( "One or more of the integers is zero\n" );
again = 1;
}
else {
g = gcd( d1, d2 );
p = ( ( n1 * ( d2 / g ) ) + ( n2 * ( d1 / g ) ) );
q = ( d1 * ( d2 / g ) );
sumn = ( p / ( gcd( p, q ) ) );
sumd = ( q / ( gcd( p, q ) ) );
printf( "The fractions are: %d/%d and %d/%d\n", n1, d1, n2, d2 );
if ( sumn == sumd ) {
printf( "Their sum is: 1\n" );
}
else {
if ( sumd == 1 ) {
printf( "Their sum is: %d\n", sumn );
}
else {
printf( "Their sum is: %d/%d\n", sumn, sumd );
}
}
}
}
}
-Sandip