string intToRoman(int num) { string ans; int weight = 0; while (num) { ans = getRoman(num % 10, weight++) + ans; num /= 10; } return ans; }
string intToRoman(int num) {// 几千+ 几百+ 几十 + 几 string ret=""; vector<int> num2; while(num){ num2.push_back(num%10); num=num/10; } //num2 存的是ix:0个位,ix:3 千位 for(int i=num2.size()-1;i>=0;--i){//先算千位表达式再百位十位 if(i==3){//千位 ret+=getRoman(num2[i],"M","",""); } if(i==2){//百位 ret+=getRoman(num2[i],"C","D","M"); } if(i==1){//十位 ret+=getRoman(num2[i],"X","L","C"); } if(i==0){//个位 ret+=getRoman(num2[i],"I","V","X"); } } return ret; }
/** メインスレッド */ void ImeServer::service() { uintptr_t targetID = MonAPI::Message::lookupMainThread("MONITOR.BIN"); if (targetID == THREAD_UNKNOWN) { printf("IME: Monitor server not found\n"); exit(1); } if (MonAPI::Message::send(targetID, MSG_STARTED, 0, 0, 0, NULL)) { printf("IME: Server start failed\n"); exit(1); } // 辞書が読めなかったときはかな漢字変換はすべて失敗を返す bool dicLoaded = loadDictionary(); MessageInfo info; while (1) { if (!MonAPI::Message::receive(&info)) { switch(info.header) { case MSG_IMESERVER_GETKANJI: { HList<MonAPI::CString> result; int hit = getKanji(info.str, &result); // MSG_IMESERVER_GETKANJI // arg2: ヒット数 if (dicLoaded == true) { MonAPI::Message::reply(&info, hit, 0, NULL); } else { MonAPI::Message::reply(&info, 0, 0, NULL); } if (dicLoaded == true && hit > 0) { // MSG_IMESERVER_STARTKANJI // arg1: ヒット数 MonAPI::Message::sendReceive(&info, info.from, MSG_IMESERVER_STARTKANJI, hit, 0, 0, NULL); for (int i = 0; i < hit; i++) { // MSG_IMESERVER_KANJI // arg1: ヒット数 // arg2: カウンタ // str : よみ→漢字 MonAPI::Message::sendReceive(&info, info.from, MSG_IMESERVER_KANJI, hit, i, 0, (const char*)result.get(i)); //printf("%d: %s\n", i, (const char*)result.get(i)); } // MSG_IMESERVER_ENDKANJI // arg1: ヒット数 MonAPI::Message::sendReceive(&info, info.from, MSG_IMESERVER_ENDKANJI, hit, 0, 0, NULL); } } break; case MSG_IMESERVER_GETYOMI: { // MSG_IMESERVER_GETYOMI // arg2: 0-失敗 1-成功 // str : 漢字→よみ char result[MAX_TEXT_LEN]; if (dicLoaded == true && getYomi(info.str, result) == true) { strncpy(info.str, result, MAX_TEXT_LEN); MonAPI::Message::reply(&info, 1, 0, result); } else { strncpy(info.str, "", MAX_TEXT_LEN); MonAPI::Message::reply(&info, 0, 0, ""); } } break; case MSG_IMESERVER_GETKANA: { // MSG_IMESERVER_GETKANA // arg2: 0-失敗 1-成功 // str : 入力文字→かな char result[MAX_TEXT_LEN]; if (getKana(info.str, result) == true) { strncpy(info.str, result, MAX_TEXT_LEN); MonAPI::Message::reply(&info, 1, 0, result); } else { strncpy(info.str, "", MAX_TEXT_LEN); MonAPI::Message::reply(&info, 0, 0, ""); } } break; case MSG_IMESERVER_GETROMAN: { // MSG_IMESERVER_GETROMAN // arg2: 0-失敗 1-成功 // str : かな→入力文字 char result[MAX_TEXT_LEN]; if (getRoman(info.str, result) == true) { strncpy(info.str, result, MAX_TEXT_LEN); MonAPI::Message::reply(&info, 1, 0, result); } else { strncpy(info.str, "", MAX_TEXT_LEN); MonAPI::Message::reply(&info, 0, 0, ""); } } break; } } } }