写了一个程序但不知道哪里有问题,帮忙改下

写了一个程序但不知道哪里有问题,帮忙改下

问题描述:

求两个正整数的最大公约数与最小公倍数。我的代码如下:

#include<stdlib.h>
int main()
{
    int t ,m, n;
    scanf_s("%d", &t);
    while (t--)
    {
        int temp1=0,temp2=0;
        scanf_s("%d%d", &m, &n);
        if (m > 0 && n > 0)
        {
            for (int i = 1;i <= (m >= n) ? n : m;i++)
            {
                if (m%i==0&&n%i==0)
                    temp1 = i;
            }
            printf("最大公约数为%d\n", temp1);
            for (int i = (m >= n) ? m : n;;i++)
            {
                if (i%m == 0 && i%n == 0)
                {
                    temp2 = i;break;
                }
            }
            printf("最小公倍数为%d\n", temp2);
        }
        else printf("输入非法");
    }
    system("pause");
    return 0;
}

第一个for (int i = 1;i <= (m >= n) ? n : m;i++)中三目运算符的优先级低于<=所以先<=后三目,
然而这样就是死循环了,于是就得不到结果。
解决方法:在三目运算符整体外加个括号,扩大优先级
改为for (int i = 1;i <=( (m >= n) ? n : m);i++)
然后你的写法可以优化:

#include <iostream>
using namespace std;
int main()
{
    int a, b, c,temp;
    cin >> a;
    while( a-- )
    {
        cin >> b;
        cin >> c;
        if( b <= 0 || c <= 0)
        {
            cout << "输入不合法" <<endl;
            break;
        }
        for( int i = 1 ; i <= ( (b <= c) ? b : c) ; i++)
        {
            if( b % i == 0 && c % i ==0 )
            {
                temp = i;
            }
        }
        cout << "最大公约数是" << temp << endl;
        temp = ( b * c )/ temp;
        cout << "最小公倍数是" << temp;
    }
    cin.get();
    return 0;
}

我习惯用c++...