我正在编写一个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;
}
答案 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 ++打印出数据。
编辑:
修复方法是a
和b
为正:
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