有趣的问题系列-仅能使用加减乘除,主函数,分别输出两个数的最大值和最小值

前言

今天我在QQ群划水的时候,我看到了一个非常有趣的问题,

仅能使用加减乘除,主函数,输入输出,来分别输出给定两个数的最大值和最小值。禁止使用位运算。禁止使用有关任何条件判断的语句。

这道题我思考了许久,突然想到了一个方案,因为\(a > b\)的时候\(\left\lfloor\dfrac{b}{a}\right\rfloor = 0\),然后\(b > a\)的时候\(\left\lfloor\dfrac{a}{b}\right\rfloor = 0\),如果把这个作为乘数,就能做开关门了,然后就这么想着,瞎搞出来了……

分析

我得到的思路是这样的,

\(\max(a, b) = \dfrac{a \times \left\lfloor\dfrac{a}{b}\right\rfloor + b \times \left\lfloor\dfrac{b}{a}\right\rfloor}{\left\lfloor\dfrac{a}{b}\right\rfloor + \left\lfloor\dfrac{b}{a}\right\rfloor}\)

\(\min(a, b) = \dfrac{b \times \left\lfloor\dfrac{a}{b}\right\rfloor + a \times \left\lfloor\dfrac{b}{a}\right\rfloor}{\left\lfloor\dfrac{a}{b}\right\rfloor + \left\lfloor\dfrac{b}{a}\right\rfloor}\)

证明一下也非常简单。这里只证明最大,最小的也同理。

首先\(a > b\),此时\(\left\lfloor\dfrac{b}{a}\right\rfloor = 0\),原式就可以变为\(\dfrac{a \times \left\lfloor\dfrac{a}{b}\right\rfloor + b \times 0}{\left\lfloor\dfrac{a}{b}\right\rfloor + 0}\),即\(\dfrac{a \times \left\lfloor\dfrac{a}{b}\right\rfloor}{\left\lfloor\dfrac{a}{b}\right\rfloor} = a\),符合\(\max\)

然后\(b > a\),此时\(\left\lfloor\dfrac{a}{b}\right\rfloor = 0\),原式就可以变为\(\dfrac{a \times 0 + b \times \left\lfloor\dfrac{b}{a}\right\rfloor}{0 + \left\lfloor\dfrac{b}{a}\right\rfloor}\),即\(\dfrac{b \times \left\lfloor\dfrac{b}{a}\right\rfloor}{\left\lfloor\dfrac{b}{a}\right\rfloor} = b\),仍然符合\(\max\)

最后是\(a = b\)的情况,此时\(\left\lfloor\dfrac{a}{b}\right\rfloor = \left\lfloor\dfrac{b}{a}\right\rfloor = 1\),此时原式等于\(\max(a, b) = \dfrac{a \times 1 + b \times 1}{1 + 1}\),即\(\dfrac{a + b}{2}\),显然此时因为\(a = b\),所以答案就是\(a\),也是符合\(\max\)的特征。

代码,请。

代码

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-04-03 10:22:07 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-04-03 10:24:14
 */
#include <iostream>
#include <cstdio>

int main() {
    int a, b;
    std :: cin >> a >> b;
    std :: cout << (a * (a / b) + b * (b / a)) / (a / b + b / a) << std :: endl;
    std :: cout << (b * (a / b) + a * (b / a)) / (a / b + b / a) << std :: endl;
    return 0;
}
posted @ 2020-04-03 12:00  dbxxx  阅读(669)  评论(1编辑  收藏  举报