与引用调用有关的C ++最小最大问题

时间:2018-11-22 04:05:54

标签: c++ algorithm

ex)示例1
输入:100500, 正确的结果:200250,

ex)示例2
输入:355321, 正确的结果:177 642

像这样,较小的输入必须为* 2,较大的输入必须为/ 2。

,并且必须按输入顺序打印出来(我称它为“ t”,“ t2”)

这看起来很简单,但我必须先打印然后才能通过。 例如)先通过355,然后保存为“ t”并进行修改,然后再进行打印。

首先,我尝试了a'<'b? a:b或max(),但355 321个案例存在问题, 所以我一直简化功能

我的最终代码是这个(忽略非有效负载):

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void sout(int& , int&,int &max, int& min);

int main()
{

    int ma, mn;
    int t;
    cin >> t;
    int t2;
    cin >> t2;
    sout(t,t2,ma,mn) ;
    cout << t << ' ' << t2;
}
void sout(int& t, int& t2 ,int &ma, int& mn)
{
    if (t > t2) {
        t /= 2;
        t2 *= 2;
    }

    if (t < t2) {
        t2 /= 2;
        t *= 2;
    }
}

但是我在测试用例355、321中失败了。 我的代码印出了354、321。 我的意思是xxxx男人为什么355减少1并idk发生了什么,我又如何通过其他测试用例?它只是一样的数字!!!

因此,我尝试使用该地址进行比较(因为我必须使用函数并使用按引用进行调用),所以这部分是固定的:

   if (&t > &t2) {
                t /= 2;
                t2 *= 2;
            }

    if (&t < &t2) {
                t2 /= 2;
                t *= 2;
            }

然后它起作用了。但在其他情况下失败,例如35、3-> 70、1

有人可以向我解释吗?我希望结构相同,因为我希望在这里固定好奇心;

干杯!

1 个答案:

答案 0 :(得分:1)

由于两个条件都使用if,因此在某些情况下,两个条件都将被执行。

// t = 355, t2 = 321
if (t > t2) {
    t /= 2;
    t2 *= 2;
    // t = 177, t2 = 642
}
// t = 177, t2 = 642
if (t < t2) {
    t2 /= 2;
    t *= 2;
    // t = 354 , t2 = 321
}
// return t = 354 , t2 = 321

else用于第二个条件。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void sout(int& , int&,int &max, int& min);

int main()
{

    int ma, mn;
    int t;
    cin >> t;
    int t2;
    cin >> t2;
    sout(t,t2,ma,mn) ;
    cout << t << ' ' << t2;
}
void sout(int& t, int& t2 ,int &ma, int& mn)
{
    if (t > t2) {
        t /= 2;
        t2 *= 2;
    }
    else {
        t2 /= 2;
        t *= 2;
    }
}

使用三元运算符:

void sout(int& t, int& t2 ,int &ma, int& mn)
{   
    (t < t2) ? (t*=2, t2/=2) : (t/=2, t2*=2);
}