#include <bits/stdc++.h> #include "nlohmann/json.hpp" using namespace std; using json = nlohmann::json; pair<string, string> splite_number(string s) { string integral_part, decimal_part; //小数点があるか判定し、整数部と小数部に分割 bool decimal_flag = false; for (char c : s) { if (!decimal_flag) { if (c == '.') { decimal_flag = true; continue; } else { integral_part += c; } } else { decimal_part += c; } } //小数部がないならば、小数部の文字列をnothingにする if (!decimal_flag) decimal_part = "nothing"; return {integral_part, decimal_part}; } string integral_translate(string s) { // jsonファイルを開く ifstream i("number.json"); json j; i >> j; //整数部の長さを取得 int l = s.size(); // 3ずつに区切ったときのブロックの数 int block = l / 3 + (l % 3 == 0 ? 0 : 1); //先頭のブロックの文字数 int head; if (l % 3 == 0) head = 3; else if (l % 3 == 2) head = 2; else if (l % 3 == 1) head = 1; //返す文字列 string ans; //ブロックごとに処理 for (int i = 0; i < block; i++) { //ブロックの切り出し string tmp; if (i == 0) { //先頭ブロックの処理 tmp = s.substr(0, head); } else { //それ以外のブロックの処理 tmp = s.substr(head * i, 3); } //ブロック内が000なら読まない if (tmp == "000") continue; // jsonファイルを参照する時のkey string moji; //英語に変換 if (i == 0 && head != 3) { //先頭ブロックが3文字でないとき if (head == 2) { //先頭ブロックが2文字 //十の位 moji = tmp[0]; moji += '0'; ans += j[moji].get<string>(); //一の位 moji = tmp[1]; if (tmp[1] != '0') { //前に単語があるので空白を入れる ans += " "; ans += j[moji].get<string>(); } } else { //先頭ブロックが1文字 moji = tmp[0]; ans += j[moji].get<string>(); } } else { //先頭ブロックが3文字のときとその他ブロックの処理 //百の位 moji = tmp[0]; ans += j[moji].get<string>(); ans += " "; ans += "hundred "; //十の位 moji = tmp[1]; moji += '0'; ans += j[moji].get<string>(); ans += " "; //一の位 moji = tmp[2]; if (tmp[2] != '0') ans += j[moji].get<string>(); } //単語の間に空白を入れる ans += " "; // thousand,million,billion,trillionなどを付与する int scale = block - i - 1; if (scale == 4) ans += "trillion "; else if (scale == 3) ans += "billion "; else if (scale == 2) ans += "million "; else if (scale == 1) ans += "thousand "; } return ans; } string decimal_translate(string s) { // jsonファイルを開く ifstream i("number.json"); json j; i >> j; //返す文字列 string ans; // 1文字ずつ変換する for (char c : s) { // keyがstring型なので変換する string tmp = {c}; //英訳する ans += j[tmp]; //単語の間に空白を入れる ans += " "; } //最後の空白はいらないので削除する ans.pop_back(); return ans; } string translate(string s) { string answer; //文字列を整数部と小数部に分割 auto [integral_part, decimal_part] = splite_number(s); //整数部を英語読みにする answer = integral_translate(integral_part); //小数部を英語読みする if (decimal_part != "nothing") { //小数部がある場合、区切りにpointが入る answer += "point "; //小数点以下の翻訳 answer += decimal_translate(decimal_part); } return answer; } int main() { string s; cin >> s; cout << translate(s) << endl; return 0; }