日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

大写汉字转阿拉伯数字c语言,阿拉伯数字转中文数字方法详解(C++实现)

發(fā)布時間:2024/9/27 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大写汉字转阿拉伯数字c语言,阿拉伯数字转中文数字方法详解(C++实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

阿拉伯數(shù)字與中文數(shù)字沒有一一對應關系,不存在直接轉換的公式化算法,因此需要根據(jù)兩種數(shù)字體系的特點精心構造轉換算法。

中文計數(shù)有一個特點,就是“零”的使用變化多端。阿拉伯數(shù)字中數(shù)字的權位依靠數(shù)字在整個數(shù)字長度中的偏移位置確定,因此數(shù)字中間出現(xiàn)的0用于標記數(shù)字的偏移位置,即便是連續(xù)出現(xiàn)的0也不能省略。中文計數(shù)方式中每個數(shù)字的權位都直接跟在數(shù)字后面,因此代表連續(xù)出現(xiàn)的若干個0。

盡管如此,也不是所有的情況都使用“零”,比如阿拉伯數(shù)字 20001234,中文數(shù)字表示為“二千萬一千二百三十四”,沒有用一個“零”;再比如阿拉伯數(shù)字 12000,中文數(shù)字表示為“一萬二千”,也沒有用“零”;但是對于阿拉伯數(shù)字 10210300,中文數(shù)字表示為“一千零二十一萬零三百”,兩次出現(xiàn)“零”。

針對這種情況,中文數(shù)字對“零”的使用總結起來有以下三條規(guī)則:

以 10000 為小節(jié),小節(jié)的結尾即使是 0,也不使用“零”。

小節(jié)內兩個非?0 數(shù)字之間要使用“零”。

當小節(jié)的“千”位是 0 時,若本小節(jié)的前一小節(jié)無其他數(shù)字,則不用“零”,否則就要用“零”。

從阿拉伯數(shù)字到中文數(shù)字的轉換,第一步是以“萬”為單位分節(jié),并確定節(jié)權位。第二步是對每小節(jié)內的數(shù)字確定權位,并按照前面的三種方法處理“零”的問題:

一個轉換示例

以阿拉伯數(shù)字 200001010200 為例,首先以“萬”為單位對其分節(jié),可分為三節(jié):2000 0101 0200:

第一節(jié) 2000,節(jié)權位是“億”,因為這一節(jié)的 0 都在結尾,根據(jù)規(guī)則 1,此處不使用“零”,直接表示為“二千億”。

第二節(jié) 0101,節(jié)權位是“萬”,因兩個 1 之間有 0,根據(jù)規(guī)則?2,101 可以描述為“一百零一”。另外,此節(jié)的千位是 0,根據(jù)規(guī)則 3,因本小節(jié)前還有數(shù)字,因此需要用“零”。也就是說,本小節(jié)需要兩個“零”。

最后一個小節(jié),結尾的兩個 0 根據(jù)規(guī)則 1,不使用“零”,但是千位的 0 根據(jù)規(guī)則 3,需要使用“零”。

根據(jù)以上分析,將三個小節(jié)的轉換結果組合在一起,阿拉伯數(shù)字 200001010200 的中文表示就是“二千億零一百零一萬零二百”。

從這個例子可以看出來,對阿拉伯數(shù)字分節(jié),確定數(shù)字的權位很簡單,最難處理的就是 0 的轉換,需要根據(jù)三個規(guī)則靈活選擇是否需要使用“零”。

轉換算法設計

設計阿拉伯數(shù)字轉中文數(shù)字的算法,也可以遵循上例中的兩個步驟來處理,但是需要解決三個問題。

第一個問題是單個數(shù)字的轉換,這個并不難,因為阿拉伯數(shù)字 0?9 與相應的中文數(shù)字是一一對應的。對這個轉換設計算法非常簡單,可以定義中文數(shù)字表:

const char *chnNumChar[CHN_NUM_CHAR_COUNT] = {"零","一","二","三","四","五","六","七","八","九"};

待轉換的阿拉伯數(shù)字作為const char *chnUnitSection[] = {"萬","億","萬億"};

對于 32 位正數(shù)能表達的最大數(shù)來說,最大節(jié)權是“萬億”己經(jīng)足夠了,如果要轉換更大的數(shù),可以延伸這個節(jié)權表的定義,比如增加“億億”。數(shù)字中最低的節(jié)沒有節(jié)權,使用空字符const char *chnUnitChar[] = {"十","百","千"};

最低位的權位是空字符串,處理方式和節(jié)權位的處理方式一樣。數(shù)字權位的確定并不困難,通過移位就可以確定每個數(shù)字對應的權位。阿拉伯數(shù)字的權位是隱含在數(shù)字的位數(shù)中的,使用 0 作為占位符。比如數(shù)字 1000,要使1處在千位,一定會補 3 個 0 作為占位符,否則1就不代表“一千”。

既然每一位的權都在固定的位置上,只要記錄移位的次數(shù)就可以確定阿拉伯數(shù)字的權位,以移位次數(shù)做下標,直接查 chnUnitSection 和 chnUnitChar 表就可以得到正確的中文數(shù)字的權位。

第三個需要解決的問題是如何處理中文“零”。這個問題稍微有點困難,需要根據(jù)文章開頭給出的三個規(guī)則靈活判斷,此外,對于連續(xù)出現(xiàn)的阿拉伯數(shù)字 0,也只能用一個中文“零”。

算法實現(xiàn)

轉換算法首先要對阿拉伯數(shù)字分節(jié),并確定節(jié)權位名稱。num 對 10000 取模可得到一個 section,將這個 section 轉成中文數(shù)字,然后根據(jù)節(jié)的位置補上節(jié)權位,即可完成一個節(jié)的中文數(shù)字轉換。重復這個過程,直到 num 等于 0 為止,整個轉換就算完成。

unitPos 變量記錄節(jié)的位置,0 對應空字符串,1 對應“萬”,2 對應“億”,隨著 unitPos 的增加,節(jié)權位也越來越大。全 0 的節(jié)不需要節(jié)權位,這個在代碼中也有處理。根據(jù)規(guī)則 3 的定義,如果一節(jié)內數(shù)字的千位是 0,需要根據(jù)前面是否還有數(shù)字決定是否需要加“零”,NumberToChinese() 函數(shù)中利用變量 needZero 和 while(num > 0) 循環(huán)語句,巧妙地做了這個加“零”處理,省去了一個if判斷。

//num == 0需要特殊處理,直接返回"零"

void NumberToChinese(unsigned int num, std::string& chnStr)

{

int unitPos = 0;

std::string strIns;

bool needZero = false;

while(num > 0)

{

unsigned int section = num % 10000;

if(needZero)

{

chnStr.insert(0, chnNumChar[0]);

}

SectionToChinese(section, strIns);

/*是否需要節(jié)權位? */

strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0];

chnStr.insert(0, strIns);

/*千位是0需要在下一個section補零*/

needZero = (section < 1000) && (section > 0);

num = num / 10000;

unitPos++;

}

}

SectionToChinese() 函數(shù)將一個節(jié)的數(shù)字轉換成中文數(shù)字,利用中文數(shù)字表 chnNumChar 轉換中文數(shù)字,利用表 chnUnitChar 得到數(shù)字權位,unitPos 變量用作權位索引。SectionToChinese() 函數(shù)的關鍵部分是對 0 的處理,根據(jù)規(guī)則 1 和規(guī)則 2,小節(jié)結尾的 0 不需要轉換成“零”,但是兩個數(shù)字之間的 0 需要轉換成“零”。如果兩個數(shù)字之間有 多個 0,也只轉換一個“零”,變量 zero 用于控制“零”的轉換,避免出現(xiàn)多個“零”連在一起的情況。

void SectionToChinese(unsigned int section, std::string& chnStr)

{

std::string strIns;

int unitPos = 0;

bool zero = true;

while(section > 0)

{

int v = section % 10;

if(v == 0)

{

if( (section ==0) || Izero )

{

zero = true; /*需要補,zero的作用是確保對連續(xù)的多個,只補一個中文零*/

chnStr.insert(0, chnNumChar[v]);

}

}

else

{

zero = false; //至少有一個數(shù)字不是

strIns = chnNumChar[v]; //此位對應的中文數(shù)字

strIns += chnUnitChar [unitPos]; //此位對應的中文權位

chnStr.insert(0, strIns);

}

unitPos++; //移位

section = section / 10;

}

}

中文大寫數(shù)字

中文數(shù)字還有一個很有意思的現(xiàn)象,就是中文數(shù)字大寫。所謂的大寫其實就是用一些筆畫復雜的漢字代替簡單的數(shù)字漢字,其目的就是為了保證其不容易被篡改。中文大寫用“壹貳叁肆伍陸柒捌玫”代替“一二三四五六七八九”,用“拾佰仟”代替“十百千”。這些數(shù)字的繁寫其實在唐代就己經(jīng)出現(xiàn),但正式作為記載錢糧、稅收等項目用的官方數(shù)字,是在明朝初年著名的“郭桓案”之后。

郭桓案:與空印案、胡惟庸案和藍玉案一起并稱為明初四大案。郭桓案發(fā)生在明朝洪武十八年(1385年),屬于官吏貪污案件。戶部侍郎郭桓等人,串通地方官吏作弊,篡改賬冊,私吞太平、鎮(zhèn)江等府的賦稅,還盜賣官糧。后被揭發(fā),以其涉案金額巨大,對經(jīng)濟領域影響深遠而為世人矚目,對此,明太祖將六部左、右侍郎以下官員全部處死,地方官吏死于獄中者達數(shù)萬人以上。為了追贓,牽連到全國各地的小富百姓,遭到抄家破產的不計其數(shù)。由于牽扯面 廣,全國百姓對此案非常不滿意,明太祖為了平息民怨,將審刑官吳席等人也一并處死。

實現(xiàn)中文大寫數(shù)字的轉換,只需要將 chnNumChar、chnUnitSection 中的中文數(shù)字和權位名稱替換成大寫數(shù)字就可以了,轉換算法是一樣的。如果用于人民幣記賬,可調整節(jié)權位的名稱,加上“圓”或“圓整”等權名,有興趣的讀者可自行完成轉換代碼。

總結

以上是生活随笔為你收集整理的大写汉字转阿拉伯数字c语言,阿拉伯数字转中文数字方法详解(C++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。