{ }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);}