给定一个整数,请你输出这个整数的中文读法。
例如:
153,读作一百五十三
103,读作一百零三
1003,读作一千零三
数据范围:
#include <bits/stdc++.h> using namespace std; string suffixs[4]={"","万","亿"}; string dig_name[4]={"","十","百","千"}; string dig_chinese[11]={"","一","二","三","四","五","六","七","***"}; int main(){ int val; cin>>val; bool zero_front = true;//当前位前面是否存在非零数字,用于判断前面存在零时是否需要打印零 if(val==0){ cout<<"零"<<endl; return 0; } int suffixs_id = 2;//后缀,亿,万 int zero_cnt = 0;//当前位前面存在的零的个数,用于解决*0*问题 if(val<0){ cout<<"负"; val = abs(val); } while(val){ int cur_val = val/(int)pow(10,4*suffixs_id);//得到ABCD if(cur_val){//ABCD不为0时,才需要进行转化 for(int i=3;i>=0;--i){ int dig = cur_val/(int) pow(10,i); cur_val%=(int)pow(10,i); if(dig){ if(!zero_front&&zero_cnt) cout<<"零"; //当A01D时,不念做一十D if(dig!=1||zero_cnt==0||i!=1)cout<<dig_chinese[dig]; cout<<dig_name[i]; zero_cnt=0; }else zero_cnt++; zero_front = zero_front&&dig==0;//更新 } cout<<suffixs[suffixs_id]; } val%=(int)pow(10,4*suffixs_id); suffixs_id--; } return 0; }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串 */ vector<string> chnNumChar = {"零","一","二","三","四","五","六","七","***"}; vector<string> chnUnitSection = {"", "万","亿","万亿"}; vector<string> chnUnitChar = {"", "十","百","千"}; void SectionToChinese(unsigned int section, string& chnStr) { string strIns; int unitPos = 0; bool zero = true; while(section > 0) { int v = section % 10; if (v != 0) { strIns = chnNumChar[v]; strIns += chnUnitChar[unitPos]; zero = false; } else { if (!zero) { strIns = chnNumChar[v]; zero = true; } } chnStr.insert(0, strIns); if ((section / 10 == 0 && strIns.substr(0, 3) == "一") && chnUnitChar[unitPos] == "十") { chnStr.erase(chnStr.begin(), chnStr.begin() + 3); } unitPos++; section /= 10; } } string num2cn(int num) { if (num == 0) return "零"; bool flag = false; if (num < 0) { num = -num; flag = true; } string chnStr; int unitPos = 0; bool needZero = false; while (num > 0) { uint32_t section = num % 10000; string strIns; SectionToChinese(section, strIns); strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0]; chnStr.insert(0, strIns); num = num / 10000; unitPos++; if (num > 0 && section < 1000 && section > 0) { // 针对60500这种,五百前面需要加0 chnStr.insert(0, "零"); } } if (flag) { chnStr.insert(0, "负"); } return chnStr; } };
import java.util.*; public class Solution { public String num2cn (int num) { String[] arr1 = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; String[] arr2 = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万", "十", "百", "千", "亿"}; //可继续追加更高位转换值 if (num == 0) { return "零"; } boolean negative = false; if (num < 0) { num = Math.abs(num); negative = true; } String english = String.valueOf(num); String result = ""; for (int i = 0; i < english.length(); i++) { int des_i = english.length() - 1 - i;//倒序排列设值 result = arr2[i] + result; int arr1_index = Integer.parseInt(String.valueOf(english.charAt(des_i))); result = arr1[arr1_index] + result; } //将【零千、零百】换成【零】 【十零】换成【十】 result = result.replaceAll("零(千|百|十)", "零").replaceAll("十零", "十"); //合并中间多个零为一个零 result = result.replaceAll("零+", "零"); //将【零亿】换成【亿】【零万】换成【万】 result = result.replaceAll("零亿", "亿").replaceAll("零万", "万"); //将【亿万】换成【亿】 result = result.replaceAll("亿万", "亿"); //移除末尾的零 result = result.replaceAll("零+$", ""); //将【零一十】换成【零十】 //result = result.replaceAll("零一十", "零十");//貌似正规读法是零一十 //将【一十】换成【十】 result = result.replaceAll("^一十", "十"); if(negative) { result = "负" + result; } return result; } }
function num2cn( n ) { const absN = Math.abs(n) const arr = String(absN).replace(/\d(?=(?:[0-9]{4})+$)/g, (...params) => { return params[0] + ',' }).split(',') const names1 = ['', '十', '百', '千'] const names2 = ['', '万', '亿'] const names3 = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] let res = '' for (let i=arr.length - 1; i>=0; --i) { const val = arr[i] let str = '' for (let j=val.length - 1; j>=0; --j) { const v = Number(val[j]) const suffix = names3[v] === '零' ? '' : names1[val.length - 1 - j] let prefix = (names3[v] === '零' && (str[0] === '零' || (!str && res[0] === '零'))) || (names3[v] === '零' && !str && !res) || (names3[v] === '一' && j === val.length - 2 && i === 0) ? '' : names3[v] str = prefix + suffix + str } if (str) { res = str + names2[arr.length - 1 - i] + res } } return res === '' ? '零' : n < 0 ? '负' + res : res }
package main import ( "strconv" ) /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串 */ func num2cn( n int ) string { digits := []string{ "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", } innerUnit := []string{ "", "十", "百", "千", } outerUnit := []string{ "", "万", "亿", } // 特殊case if n==0{ return digits[0] } sign := 1 if n<0{ sign = -1 n = -n } numStr := strconv.Itoa(n) var res string outerStep := 0 for i:=len(numStr)-1;i>=0;{ step := 0 secNumStr := "" hasRightNonZero := false for step<4 && i>=0{ //特殊case,0是否发音取决于后面还有没有非0数字 if numStr[i]=='0' { if hasRightNonZero{ //多个0只留一个 for step<4 && i>=0 && numStr[i]=='0'{ step++ i-- } secNumStr = digits[0] +secNumStr } else{ step++ i-- } continue } hasRightNonZero = true //处理特殊case 整个part如果为12这种,应该读作十二,1不发音 if step==1 && numStr[i]=='1' && i==0{ secNumStr = innerUnit[step] + secNumStr } else{ // 普通模式 secNumStr = digits[numStr[i]-'0'] + innerUnit[step] + secNumStr } step++ i-- } //特殊case,整个part不发音,也就不能带单位了 if secNumStr==""{ // } else{ res = secNumStr + outerUnit[outerStep] + res } outerStep++ } if sign == -1{ res = "负" + res } return res }