最大公約数と最小公倍数
二つの自然数 a, b が空白で区切られて一行で与えられる。
a と b の最大公約数と最小公倍数を、空白一つで区切って一行に出力せよ。
- 入力
- 1 ≤ a, b ≤ 10^12。
最小公倍数は 10^15 を超えない。 - 出力
- 最大公約数 最小公倍数
12 18
6 36
987000000000 977000000000
1000000000 964299000000000
二つの自然数 a, b が空白で区切られて一行で与えられる。
a と b の最大公約数と最小公倍数を、空白一つで区切って一行に出力せよ。
12 18
6 36
987000000000 977000000000
1000000000 964299000000000
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
最大公約数はユークリッドの互除法(b が 0 になるまで a, b = b, a % b)で求め、最小公倍数は a / g * b のように先に割ってから掛けます。a * b / g と先に掛けると、例 2 では a*b ≈ 9.6×10^23 となり、C・C++・Java・C# の 64 ビット long(約 9.2×10^18)があふれ、JavaScript・TypeScript・Craykon は 2^53 を超えて下の桁が狂います。
整数に上限のない Python だけはどちらでも正しく出ます。
10^12 は 32 ビット int(約 21 億)に入らないので、C 系は最初から long/long long で読みます。
組み込み関数:Python math.gcd、C++ std::gcd(<numeric>)、C# BigInteger.GreatestCommonDivisor。
Craykon では 最大公約数(a, b) { … 返す a; } のように関数を作り、/ は小数まで割るので商は 数学.商(a, g) で求めます。
def gcd(a, b): while b: a, b = b, a % b return a a, b = map(int, input().split())g = gcd(a, b)print(g, a // g * b)const [a, b] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number); function gcd(a, b) { while (b !== 0) [a, b] = [b, a % b]; return a;} const g = gcd(a, b);console.log(`${g} ${(a / g) * b}`);import { readFileSync } from "node:fs";const [a, b]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number); function gcd(a: number, b: number): number { while (b !== 0) [a, b] = [b, a % b]; return a;} const g = gcd(a, b);console.log(`${g} ${(a / g) * b}`);import java.util.Scanner; public class Main { static long gcd(long a, long b) { while (b != 0) { long t = a % b; a = b; b = t; } return a; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); long a = sc.nextLong(), b = sc.nextLong(); long g = gcd(a, b); System.out.println(g + " " + (a / g * b)); }}using System; class Program{ static long Gcd(long a, long b) { while (b != 0) { (a, b) = (b, a % b); } return a; } static void Main() { long[] v = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), long.Parse); long g = Gcd(v[0], v[1]); Console.WriteLine($"{g} {v[0] / g * v[1]}"); }}#include <iostream>#include <numeric> int main() { long long a, b; std::cin >> a >> b; long long g = std::gcd(a, b); std::cout << g << ' ' << a / g * b << '\n';}#include <stdio.h> long long gcd(long long a, long long b) { while (b != 0) { long long t = a % b; a = b; b = t; } return a;} int main(void) { long long a, b; scanf("%lld %lld", &a, &b); long long g = gcd(a, b); printf("%lld %lld\n", g, a / g * b); return 0;}최대공약수(a, b){ 間 (b != 0) { t = a % b; a = b; b = t; } 返す a;} 수들 = コンソール.数読み();a = 수들[0];b = 수들[1];g = 최대공약수(a, b);コンソール.書く(g + " " + 数学.商(a, g) * b);