C程序添加两个整数作为分数

时间:2011-09-26 04:20:34

标签: c

我正在编写一个C程序,它添加了两个非零整数,它们以分数形式给出。整数输入为n1 d1 n2 d2。输入某些负数时似乎存在错误,例如在以下组合中(1 2 -1 2)。这应该说明正在添加的数字是1/2和-1/2,然后声明总和为0.相反,程序只显示一个空行并且不接受任何进一步的输入。我遇到的第二个问题是,当输入sentinel值时,程序应该显示终止消息然后结束,而不是显示“浮点异常”。

 int
    main( void )
    {
int n1;
int d1;
int n2;
int d2;
int g;
int p;
int q;
int again;
int sumn;
int sumd;

again = 1;

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 {
    again = 1;
  }
  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 );
      }
    }
  }
}
printf( "***** Program Terminated *****\n" );

return (EXIT_SUCCESS);
}

int gcd( int a, int b )
{
while ( a != b ) {
  if ( a > b ) {
    a = ( a - b );
  }
  else {
    b = ( b - a );
  }
}
return a;
}

3 个答案:

答案 0 :(得分:7)

gcd功能出错。当a为负时,它是一个无限循环。因此控制台挂起,不再接受任何输入。

int gcd( int a, int b )
{
    while ( a != b ) {
       cout << a << "  " << b << endl;
       if ( a > b ) {
          a = ( a - b );
       }
       else {
          b = ( b - a );
        }
    }
    return a;
}

输出:gcd(-1,2)

-1  2
-1  3
-1  4
-1  5
-1  6
-1  7
-1  8
-1  9
-1  10
-1  11
-1  12
-1  13
-1  14
...

P.S。 是的我知道问题是标记为C,但我只是用C ++打印出数据。

编辑:

修复方法是ab为正:

int gcd( int a, int b )
{
    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 :(得分:1)

当你输入sentinel值(我假设全部等于零)时,它执行你的第一个 if 情况,然后继续执行第二个 else 情况,即这个部分     别的{

g = gcd( d1, d2 );
p = ( ( n1 * ( d2 / g ) ) + ( n2 * ( d1 / g ) ) );
....

继续计算gcd,我猜是在触发浮点异常

答案 2 :(得分:0)

通过仅提供正值来照顾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