{ }codelper
条件语句P0254

放进正方形相框的照片

要把一张照片放进边长为 S 的正方形相框。
照片在保持宽高比例的前提下改变大小,使长边的长度正好是 S。
照片比相框小就放大,比相框大就缩小。
一行给出 S、照片的宽 w 和高 h,用一个空格隔开。
如果 w 大于或等于 h,新的宽是 S,新的高是 h × S 除以 w 的商。
否则新的高是 S,新的宽是 w × S 除以 h 的商。
商是除法舍去小数部分后的整数(不四舍五入)。
按新的宽、新的高的顺序在一行输出,用一个空格隔开。

输入
1 ≤ S, w, h ≤ 10,000(整数)。
长边不超过短边的 S 倍(所以新的短边至少是 1)
输出
一行:新的宽和新的高(两个整数)
样例 1 · stdin
1080 4000 3000
stdout
1080 810
样例 2 · stdin
500 600 900
stdout
333 500
main.py
输入(stdin)

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

$ 就绪

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

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

这是在两条分支里只选一条的 if-else 题。
写法:Python if w >= h: … else:(冒号和缩进就是语法),C、C++、Java、C#、JS、TS if (w >= h) { … } else { … },Craykon 如果 (w >= h) { … } 否则 { … }。
如果漏掉条件,以为宽总是长边,竖拍的照片(600 × 900)会变成 500 × 750,超出相框。
分支里的计算也有陷阱。
第一,先乘后除:C、C++、Java、C# 的 int / 只留商,写成 h / w * S 时 3000 / 4000 先变成 0,答案就是 0。
第二,只留商的方法不同。
C 系语言 int 之间用 / 即可,Python 要用 //(/ 会输出 810.0),JS/TS 用 Math.floor(h * S / w),Craykon 用 数学.商(h * S, w)。
像 Math.round 那样四舍五入,200 / 3 = 66.67 会变成 67,是错的。
乘积不超过 1 亿,32 位 int 足够。
正方形照片(w = h)走哪条分支都是 S S。

Pythonmain.py · 6 行
S, w, h = map(int, input().split())# 곱하기를 먼저 하고 //로 몫만 남긴다if w >= h:    print(S, h * S // w)else:    print(w * S // h, S)
JavaScriptmain.js · 6 行
const [S, w, h] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);if (w >= h) {  console.log(`${S} ${Math.floor((h * S) / w)}`);} else {  console.log(`${Math.floor((w * S) / h)} ${S}`);}
TypeScriptmain.ts · 7 行
import { readFileSync } from "node:fs";const [S, w, h]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);if (w >= h) {  console.log(`${S} ${Math.floor((h * S) / w)}`);} else {  console.log(`${Math.floor((w * S) / h)} ${S}`);}
JavaMain.java · 15 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int S = sc.nextInt();        int w = sc.nextInt();        int h = sc.nextInt();        if (w >= h) {            System.out.println(S + " " + h * S / w);        } else {            System.out.println(w * S / h + " " + S);        }    }}
C#Main.cs · 20 行
using System; class Program{    static void Main()    {        string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int S = int.Parse(p[0]);        int w = int.Parse(p[1]);        int h = int.Parse(p[2]);        if (w >= h)        {            Console.WriteLine($"{S} {h * S / w}");        }        else        {            Console.WriteLine($"{w * S / h} {S}");        }    }}
C++main.cpp · 11 行
#include <iostream> int main() {    int S, w, h;    std::cin >> S >> w >> h;    if (w >= h) {        std::cout << S << " " << h * S / w << "\n";    } else {        std::cout << w * S / h << " " << S << "\n";    }}
Cmain.c · 13 行
#include <stdio.h> int main(void) {    int S, w, h;    scanf("%d %d %d", &S, &w, &h);    /* 곱해도 1억까지라 int로 충분하다 */    if (w >= h) {        printf("%d %d\n", S, h * S / w);    } else {        printf("%d %d\n", w * S / h, S);    }    return 0;}
Craykonmain.cray · 13 行
p = 控制台.读行().去空白().分割(" ");S = p[0].转数字();w = p[1].转数字();h = p[2].转数字();// 크레이콘의 /는 소수까지 나누니 수학.몫으로 몫만如果 (w >= h){    控制台.输出(S + " " + 数学.商(h * S, w));}否则{    控制台.输出(数学.商(w * S, h) + " " + S);}