a 進法で書いた数を一つ b 進法に変えて出力せよ。 桁の値が 10 以上なら英大文字を使う:A = 10、B = 11、…、Z = 35。 入力も出力も先頭に余計な 0 を付けない(値が 0 なら 0 一文字)。 一行目に a と b が空白区切りで、二行目に a 進法で書いた数が与えられる。
入力
2 ≤ a, b ≤ 36、数は 0 以上で 10 進法で 10¹⁵ 以下、各桁は 0〜9 または A〜Z で a より小さい値
出力
b 進法で書いた数(大文字、先頭に 0 なし)
例 1 · stdin
16 2
FF
stdout
11111111
例 2 · stdin
10 36
1295
stdout
ZZ
main.py
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(stdin)
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
ほかの言語では?言語別の解答を見る · 8 言語の解答
読むときは前の桁から 値 = 値 × a + 桁の値、書くときは 値 % b が一番下の桁なので、割るたびに文字を前に付けるか、全部集めてから反転します。 すぐ使える道具は言語ごとに違います:Python int(s, a) は 2〜36 進法を読めますが、b 進法で書く関数はありません(bin・oct・hex だけ)。 Java は Long.parseLong(s, a) と Long.toString(v, b) がどちらも 2〜36 を受け、JavaScript・TypeScript にも parseInt(s, a) と v.toString(b) があります — ただし toString は小文字(ff)を出すので toUpperCase() が必要です。 C は strtoll(s, NULL, a)、C++ は std::stoll(s, nullptr, a) で読み、書くのは自分でします。 C# は Convert.ToInt64(s, base)・Convert.ToString(v, base) が 2・8・10・16 進法だけを受け、それ以外は例外になります — なので両方とも自分でします。 Craykon は DIGITS = "0123…Z" を置き、DIGITS.位置検索(ch) で桁の値を、DIGITS[v % b] で文字を得て、商は 数学.商(v, b) です。 罠は四つ:文字の桁の値をすべて c - '0' で求めると 'A' が 10 ではなく 17 になります(C・C++・Java・C# の文字の引き算)。 値が 0 だと while (v > 0) が一度も回らず空行が出ます(C・C++ の解答は do-while で防いでいます)。 下の桁から出た文字を後ろに付けると順番が逆になります。 そして 10¹⁵ は int を超えるので long/long long を使います(JavaScript・Craykon は 2^53 まで正確なので大丈夫です)。
Pythonmain.py · 14 行
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"a, b = map(int, input().split())s = input().strip()value = int(s, a) # int()는 2~36진법 글자를 바로 읽는다(A = 10 … Z = 35)if value == 0: print("0")else: out = [] while value > 0: out.append(DIGITS[value % b]) # 낮은 자리부터 나온다 value //= b print("".join(reversed(out)))
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(); String s = sc.next(); // Long.parseLong와 Long.toString은 2~36진법을 받는다. toString은 소문자를 내서 대문자로 바꾼다 long value = Long.parseLong(s, a); System.out.println(Long.toString(value, b).toUpperCase()); }}
C#Main.cs · 31 行
using System;using System.Text;class Program{ const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static void Main() { string[] ab = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int a = int.Parse(ab[0]), b = int.Parse(ab[1]); string s = Console.ReadLine().Trim(); // Convert.ToInt64(s, base)는 2·8·10·16진법만 받아서 직접 바꾼다 long value = 0; foreach (char ch in s) value = value * a + Digits.IndexOf(ch); if (value == 0) { Console.WriteLine("0"); return; } var sb = new StringBuilder(); while (value > 0) { sb.Insert(0, Digits[(int)(value % b)]); // 낮은 자리부터 나오니 앞에 끼운다 value /= b; } Console.WriteLine(sb); }}
C++main.cpp · 20 行
#include <algorithm>#include <iostream>#include <string>int main() { const std::string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int a, b; std::string s; std::cin >> a >> b >> s; long long value = std::stoll(s, nullptr, a); // stoll은 2~36진법을 읽는다 std::string out; do { out += digits[value % b]; // 낮은 자리부터 나온다. do-while이라 0도 "0"이 된다 value /= b; } while (value > 0); std::reverse(out.begin(), out.end()); std::cout << out << '\n';}
Cmain.c · 21 行
#include <stdio.h>#include <stdlib.h>int main(void) { const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int a, b; char s[64]; scanf("%d %d %63s", &a, &b, s); long long value = strtoll(s, NULL, a); /* strtoll은 2~36진법을 읽는다 */ char out[64]; int len = 0; do { out[len++] = digits[value % b]; /* 낮은 자리부터 나온다. do-while이라 0도 "0"이 된다 */ value /= b; } while (value > 0); for (int i = len - 1; i >= 0; i--) putchar(out[i]); putchar('\n'); return 0;}
Craykonmain.cray · 28 行
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";ab = コンソール.数読み();a = ab[0];b = ab[1];s = コンソール.行読み().空白除去();// a진법 글자를 앞에서부터 읽는다: 지금까지의 값 × a + 이 자리 값value = 0;それぞれ (ch の中 s){ value = value * a + DIGITS.位置検索(ch);}もし (value == 0){ コンソール.書く("0");}でなければ{ out = ""; 間 (value > 0) { out = DIGITS[value % b] + out; // 낮은 자리부터 나오니 앞에 붙인다 value = 数学.商(value, b); } コンソール.書く(out);}