{ }codelper
嵌套条件比较P0020

三个数的中间值

一行给出三个整数 a、b、c,用空格分隔。
把三个数按大小排好后,输出排在中间的那个数。
允许有相同的数(例如 5 5 1 的中间值是 5)。
试着不用排序函数或列表排序,只靠比较来解。

输入
-1,000,000,000 ≤ a, b, c ≤ 1,000,000,000
输出
中间的那个数
样例 1 · stdin
3 9 5
stdout
5
样例 2 · stdin
5 5 1
stdout
5
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

有相同的值时是陷阱。
像 a < b < c or c < b < a 这样只用 <,5 5 1 哪个分支都进不去,会掉到最后的 else。
先用 a >= b 分成两边,再在里面判断 c 的位置(嵌套条件),相同的值也不会漏掉。
连写比较 a < b < c 像数学那样读,只在 Python 里成立。
C、C++、Java、C#、JS 要写成 a < b && b < c(C、C++ 和 JS 在语法上也接受 a < b < c,但意思变成拿 (a < b) 的真假值(1/0、true/false)去和 c 比较)。
JS/TS 如果不把输入转成 Number,就成了字符串比较("10" < "9" 为真)。
Craykon 也是在里面再写一层:如果 (a >= b) { 如果 (…) { } 否则 { } }。
在分支里第一次创建的变量在外面不能用(Java、C#、C、C++ 也一样),所以要在分支前先创建 mid;Python 不同,if 里创建的变量在外面也能用。

Pythonmain.py · 16 行
a, b, c = map(int, input().split())if a >= b:    if b >= c:        mid = b      # a >= b >= c    elif a >= c:        mid = c      # a >= c > b    else:        mid = a      # c > a >= belse:    if a >= c:        mid = a      # b > a >= c    elif b >= c:        mid = c      # b >= c > a    else:        mid = b      # c > b > aprint(mid)
JavaScriptmain.js · 12 行
const [a, b, c] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let mid;if (a >= b) {  if (b >= c) mid = b;  else if (a >= c) mid = c;  else mid = a;} else {  if (a >= c) mid = a;  else if (b >= c) mid = c;  else mid = b;}console.log(mid);
TypeScriptmain.ts · 13 行
import { readFileSync } from "node:fs";const [a, b, c]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let mid: number;if (a >= b) {  if (b >= c) mid = b;  else if (a >= c) mid = c;  else mid = a;} else {  if (a >= c) mid = a;  else if (b >= c) mid = c;  else mid = b;}console.log(mid);
JavaMain.java · 19 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();        int mid;        if (a >= b) {            if (b >= c) mid = b;            else if (a >= c) mid = c;            else mid = a;        } else {            if (a >= c) mid = a;            else if (b >= c) mid = c;            else mid = b;        }        System.out.println(mid);    }}
C#Main.cs · 24 行
using System; class Program{    static void Main()    {        int[] v = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);        int a = v[0], b = v[1], c = v[2];        int mid;        if (a >= b)        {            if (b >= c) mid = b;            else if (a >= c) mid = c;            else mid = a;        }        else        {            if (a >= c) mid = a;            else if (b >= c) mid = c;            else mid = b;        }        Console.WriteLine(mid);    }}
C++main.cpp · 16 行
#include <iostream> int main() {    int a, b, c, mid;    std::cin >> a >> b >> c;    if (a >= b) {        if (b >= c) mid = b;        else if (a >= c) mid = c;        else mid = a;    } else {        if (a >= c) mid = a;        else if (b >= c) mid = c;        else mid = b;    }    std::cout << mid << "\n";}
Cmain.c · 17 行
#include <stdio.h> int main(void) {    int a, b, c, mid;    scanf("%d %d %d", &a, &b, &c);    if (a >= b) {        if (b >= c) mid = b;        else if (a >= c) mid = c;        else mid = a;    } else {        if (a >= c) mid = a;        else if (b >= c) mid = c;        else mid = b;    }    printf("%d\n", mid);    return 0;}
Craykonmain.cray · 36 行
v = 控制台.读数字();a = v[0];b = v[1];c = v[2];mid = 0;如果 (a >= b){    如果 (b >= c)    {        mid = b;    }    否则 如果 (a >= c)    {        mid = c;    }    否则    {        mid = a;    }}否则{    如果 (a >= c)    {        mid = a;    }    否则 如果 (b >= c)    {        mid = c;    }    否则    {        mid = b;    }}控制台.输出(mid);