from math import gcdn = int(input())num, den = 0, 1 # 지금까지의 합 num/den (늘 기약분수, den > 0)for _ in range(n): p, q = map(int, input().split("/")) lcm = den // gcd(den, q) * q # 두 분모의 최소공배수로 통분 num = num * (lcm // den) + p * (lcm // q) den = lcm g = gcd(num, den) # math.gcd는 음수를 받아도 0 이상을 돌려준다 num //= g den //= gprint(num if den == 1 else f"{num}/{den}")
JavaScriptmain.js · 22 行
const lines = require("fs").readFileSync(0, "utf8").trim().split(/\r?\n/);// %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산const gcd = (a, b) => { a = Math.abs(a); b = Math.abs(b); while (b !== 0) [a, b] = [b, a % b]; return a;};const n = Number(lines[0]);let num = 0, den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0)for (let i = 1; i <= n; i++) { const [p, q] = lines[i].trim().split("/").map(Number); const lcm = (den / gcd(den, q)) * q; // 두 분모의 최소공배수로 통분 num = num * (lcm / den) + p * (lcm / q); den = lcm; const g = gcd(num, den); num /= g; den /= g;}console.log(den === 1 ? `${num}` : `${num}/${den}`);
TypeScriptmain.ts · 23 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").trim().split(/\r?\n/);// %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산function gcd(a: number, b: number): number { a = Math.abs(a); b = Math.abs(b); while (b !== 0) [a, b] = [b, a % b]; return a;}const n = Number(lines[0]);let num = 0, den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0)for (let i = 1; i <= n; i++) { const [p, q] = lines[i].trim().split("/").map(Number); const lcm = (den / gcd(den, q)) * q; // 두 분모의 최소공배수로 통분 num = num * (lcm / den) + p * (lcm / q); den = lcm; const g = gcd(num, den); num /= g; den /= g;}console.log(den === 1 ? `${num}` : `${num}/${den}`);
JavaMain.java · 32 行
import java.util.Scanner;public class Main { // %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산 static long gcd(long a, long b) { a = Math.abs(a); b = Math.abs(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); int n = Integer.parseInt(sc.nextLine().trim()); long num = 0, den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0) for (int i = 0; i < n; i++) { String[] pq = sc.nextLine().trim().split("/"); long p = Long.parseLong(pq[0]), q = Long.parseLong(pq[1]); long lcm = den / gcd(den, q) * q; // 두 분모의 최소공배수로 통분 num = num * (lcm / den) + p * (lcm / q); den = lcm; long g = gcd(num, den); num /= g; den /= g; } System.out.println(den == 1 ? String.valueOf(num) : num + "/" + den); }}
C#Main.cs · 31 行
using System;class Program{ // %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산 static long Gcd(long a, long b) { a = Math.Abs(a); b = Math.Abs(b); while (b != 0) (a, b) = (b, a % b); return a; } static void Main() { int n = int.Parse(Console.ReadLine()); long num = 0, den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0) for (int i = 0; i < n; i++) { string[] pq = Console.ReadLine().Trim().Split('/'); long p = long.Parse(pq[0]), q = long.Parse(pq[1]); long lcm = den / Gcd(den, q) * q; // 두 분모의 최소공배수로 통분 num = num * (lcm / den) + p * (lcm / q); den = lcm; long g = Gcd(num, den); num /= g; den /= g; } Console.WriteLine(den == 1 ? $"{num}" : $"{num}/{den}"); }}
C++main.cpp · 21 行
#include <iostream>#include <numeric>int main() { int n; std::cin >> n; long long num = 0, den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0) for (int i = 0; i < n; i++) { long long p, q; char slash; std::cin >> p >> slash >> q; long long lcm = std::lcm(den, q); // 두 분모의 최소공배수로 통분 num = num * (lcm / den) + p * (lcm / q); den = lcm; long long g = std::gcd(num, den); // std::gcd는 음수를 받아도 0 이상을 돌려준다 num /= g; den /= g; } if (den == 1) std::cout << num << '\n'; else std::cout << num << '/' << den << '\n';}
Cmain.c · 33 行
#include <stdio.h>#include <stdlib.h>/* %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산 */static long long gcd(long long a, long long b) { a = llabs(a); b = llabs(b); while (b != 0) { long long t = a % b; a = b; b = t; } return a;}int main(void) { int n; scanf("%d", &n); long long num = 0, den = 1; /* 지금까지의 합 num/den (늘 기약분수, den > 0) */ for (int i = 0; i < n; i++) { long long p, q; scanf("%lld/%lld", &p, &q); long long lcm = den / gcd(den, q) * q; /* 두 분모의 최소공배수로 통분 */ num = num * (lcm / den) + p * (lcm / q); den = lcm; long long g = gcd(num, den); num /= g; den /= g; } if (den == 1) printf("%lld\n", num); else printf("%lld/%lld\n", num, den); return 0;}
Craykonmain.cray · 37 行
// %는 앞 수의 부호를 따라서 음수가 들어오면 음수 gcd가 나올 수 있다 → 절댓값으로 계산최대공약수(a, b){ a = 数学.絶対値(a); b = 数学.絶対値(b); 間 (b != 0) { t = a % b; a = b; b = t; } 返す a;}n = コンソール.行読み().数に();num = 0;den = 1; // 지금까지의 합 num/den (늘 기약분수, den > 0)繰り返す (i = 0; i < n; i++){ pq = コンソール.行読み().空白除去().分ける("/"); p = pq[0].数に(); q = pq[1].数に(); lcm = 数学.商(den, 최대공약수(den, q)) * q; // 두 분모의 최소공배수로 통분 num = num * 数学.商(lcm, den) + p * 数学.商(lcm, q); den = lcm; g = 최대공약수(num, den); num = 数学.商(num, g); den = 数学.商(den, g);}もし (den == 1){ コンソール.書く(num);}でなければ{ コンソール.書く(num + "/" + den);}