fork download
  1. import java.math.BigInteger;
  2. import java.util.Scanner;
  3.  
  4. class Ideone
  5. {
  6. static final BigInteger N10000 = BigInteger.valueOf(10000);
  7. static final BigInteger MAX_NUM = BigInteger.TEN.pow(72).subtract(BigInteger.ONE);
  8. static String[][] digit = {
  9. { "", "いち", "に", "さん", "よん", "ご", "ろく", "なな", "はち", "きゅう" },
  10. { "", "じゅう", "にじゅう", "さんじゅう", "よんじゅう", "ごじゅう", "ろくじゅう", "ななじゅう", "はちじゅう", "きゅうじゅう" },
  11. { "", "ひゃく", "にひゃく", "さんびゃく", "よんひゃく", "ごひゃく", "ろっぴゃく", "ななひゃく", "はっぴゃく", "きゅうひゃく" },
  12. { "", "せん", "にせん", "さんぜん", "よんせん", "ごせん", "ろくせん", "ななせん", "はっせん", "きゅうせん" } };
  13. static String[][] digitB = {
  14. { "", "いっ", "に", "さん", "よん", "ご", "ろく", "なな", "はっ", "きゅう" },
  15. { "", "じゅっ", "にじゅっ", "さんじゅっ", "よんじゅっ", "ごじゅっ", "ろくじゅっ", "ななじゅっ", "はちじゅっ", "きゅうじゅっ" },
  16. { "", "ひゃく", "にひゃく", "さんびゃく", "よんひゃく", "ごひゃく", "ろっぴゃく", "ななひゃく", "はっぴゃく", "きゅうひゃく" },
  17. { "", "せん", "にせん", "さんぜん", "よんせん", "ごせん", "ろくせん", "ななせん", "はっせん", "きゅうせん" } };
  18.  
  19. static String[] numerals = { "", "まん", "おく", "ちょう", "けい", "がい", "じょ", "じょう", "こう", "かん", "せい", "さい", "ごく", "ごうがしゃ", "あそうぎ", "なゆた", "ふかしぎ", "むりょうたいすう" };
  20.  
  21. static void print(BigInteger b)
  22. {
  23. int signum = b.signum();
  24. if (signum == 0)
  25. {
  26. System.out.println("ぜろ");
  27. return;
  28. }
  29.  
  30. BigInteger bi = b.abs();
  31. if (bi.compareTo(MAX_NUM) == 1)
  32. {
  33. System.out.printf("%,d => 数が大きすぎるので読めません%n%n", b);
  34. return;
  35. }
  36.  
  37. StringBuilder sb = new StringBuilder();
  38. int n = 0;
  39. while (!bi.equals(BigInteger.ZERO))
  40. {
  41. BigInteger[] dr = bi.divideAndRemainder(N10000);
  42. int r10000 = dr[1].intValue();
  43. bi = dr[0];
  44. boolean flag = n == 3 || n == 4;
  45. if (r10000 != 0)
  46. {
  47. sb.insert(0, numerals[n]);
  48. int size = sb.length();
  49. for (int i = 0; i < 4; i++)
  50. {
  51. sb.insert(0, flag ? digitB[i][r10000 % 10] : digit[i][r10000 % 10]);
  52. r10000 /= 10;
  53. flag &= size == sb.length();
  54. }
  55. sb.insert(0, " ");
  56. }
  57. n++;
  58. }
  59. if (signum == -1) sb.insert(0, "まいなす"); // 自然数に入らんか…まあいいやw
  60. System.out.printf("%,d => %s%n%n", b, sb.toString().trim());
  61. }
  62.  
  63. public static void main(String[] args)
  64. {
  65. try (Scanner in = new Scanner(System.in))
  66. {
  67. while (in.hasNextBigInteger())
  68. {
  69. print(in.nextBigInteger());
  70. }
  71. }
  72. }
  73. }
  74.  
Success #stdin #stdout 0.12s 380672KB
stdin
512
8978456234578681
8714511145614898415345614111486987891731511661165
154616486144861786715645165456145614864156867186745161756171867564561451
890054605607484040064045400000884045056040045980040800808488080000584084
1000000000000000000000000000000000000000000000000000000000000000000000000
stdout
512 => ごひゃくじゅうに

8,978,456,234,578,681 => はっせんきゅうひゃくななじゅうはっちょう よんせんごひゃくろくじゅうにおく さんぜんよんひゃくごじゅうななまん はっせんろっぴゃくはちじゅういち

8,714,511,145,614,898,415,345,614,111,486,987,891,731,511,661,165 => はちごく ななせんひゃくよんじゅうごさい せんひゃくじゅうよんせい ごせんろっぴゃくじゅうよんかん はっせんきゅうひゃくはちじゅうよんこう せんごひゃくさんじゅうよんじょう ごせんろっぴゃくじゅうよんじょ せんひゃくじゅうよんがい はっせんろっぴゃくきゅうじゅうはっけい ななせんはっぴゃくきゅうじゅういっちょう ななせんさんびゃくじゅうごおく せんひゃくろくじゅうろくまん せんひゃくろくじゅうご

154,616,486,144,861,786,715,645,165,456,145,614,864,156,867,186,745,161,756,171,867,564,561,451 => せんごひゃくよんじゅうろくむりょうたいすう せんろっぴゃくよんじゅうはちふかしぎ ろくせんひゃくよんじゅうよんなゆた はっせんろっぴゃくじゅうななあそうぎ はっせんろっぴゃくななじゅういちごうがしゃ ごせんろっぴゃくよんじゅうごごく せんろっぴゃくごじゅうよんさい ごせんろっぴゃくじゅうよんせい ごせんろっぴゃくじゅうよんかん はっせんろっぴゃくよんじゅういちこう ごせんろっぴゃくはちじゅうろくじょう ななせんひゃくはちじゅうろくじょ ななせんよんひゃくごじゅういちがい ろくせんひゃくななじゅうごけい ろくせんひゃくななじゅういっちょう はっせんろっぴゃくななじゅうごおく ろくせんよんひゃくごじゅうろくまん せんよんひゃくごじゅういち

890,054,605,607,484,040,064,045,400,000,884,045,056,040,045,980,040,800,808,488,080,000,584,084 => はっせんきゅうひゃくむりょうたいすう ごせんよんひゃくろくじゅうふかしぎ ごせんろっぴゃくなななゆた よんせんはっぴゃくよんじゅうあそうぎ よんせんろくごうがしゃ よんせんよんじゅうごごく よんせんさい はちじゅうはちせい よんせんよんじゅうごかん ごひゃくろくじゅうこう よんせんよんじょう ごせんきゅうひゃくはちじゅうじょ よんひゃくはちがい はちじゅっけい はっせんよんひゃくはちじゅうはっちょう はっぴゃくおく ごじゅうはちまん よんせんはちじゅうよん

1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 => 数が大きすぎるので読めません