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

前言

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

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

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

分析

我得到的思路是这样的,

max(a,b)=a×ab+b×baab+ba\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)=b×ab+a×baab+ba\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>ba > b,此时ba=0\left\lfloor\dfrac{b}{a}\right\rfloor = 0,原式就可以变为a×ab+b×0ab+0\dfrac{a \times \left\lfloor\dfrac{a}{b}\right\rfloor + b \times 0}{\left\lfloor\dfrac{a}{b}\right\rfloor + 0},即a×abab=a\dfrac{a \times \left\lfloor\dfrac{a}{b}\right\rfloor}{\left\lfloor\dfrac{a}{b}\right\rfloor} = a,符合max\max

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

最后是a=ba = b的情况,此时ab=ba=1\left\lfloor\dfrac{a}{b}\right\rfloor = \left\lfloor\dfrac{b}{a}\right\rfloor = 1,此时原式等于max(a,b)=a×1+b×11+1\max(a, b) = \dfrac{a \times 1 + b \times 1}{1 + 1},即a+b2\dfrac{a + b}{2},显然此时因为a=ba = b,所以答案就是aa,也是符合max\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 @   dbxxx  阅读(680)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示