蓝桥杯 人民币金额大写 格式转换
本題的任務是:從鍵盤輸入一個十億以內的正整數(int類型),把它轉換為人民幣金額大寫(不考慮用戶輸入錯誤的情況)。
比如,用戶輸入:35201,程序輸出:叁萬伍仟貳佰零壹
用戶輸入:30201,程序輸出:叁萬零貳佰零壹
用戶輸入:30001,程序輸出:叁萬零壹
用戶輸入:31000,程序輸出:叁萬壹仟
用戶輸入:120023201,程序輸出:壹億貳仟零貳萬叁仟貳佰零壹
用戶輸入:120020001,程序輸出:壹億貳仟零貳萬零壹
用戶輸入:100000001,程序輸出:壹億零壹
可以看到,在萬后滿千位,則不加零,否則要補零,但不要出現類似“零零”的情況。
在億后滿千萬位,則不加零,否則要補零,但整個“萬檔”沒有數字時,“萬”字省去。
剛看到題目的時候,我甚至直接想放棄,因為連我自己都不知道到底應該怎么念,高考語文不及格的說,不過,已經是最后一道了,如果不做出來會很糾結。。。
其實,這道題并沒有想象的那么復雜,我在百度上看到了很多轉換軟件,我不知道他們的算法,這里,我講一下我的算法,并沒有參考任何資料,如有雷同,純屬巧合
一、將每一位數字連數值帶數量級原原本本的記錄下來,當然,如果是0,那么它的數量級在任何情況下都是不需要輸出的,比如120020300,直接輸出
壹億貳仟萬零零貳萬零叁佰零零
二、現在看起來好像有那么點味道,不過還是很奇怪,哪里不對呢?首先,最后那兩個“零”是不應該輸出的,總結一下,就是從后往前數,直到遇到第一個不為0的數n=3,n之后的0全都是多余的,知道了這一點,我們首先用一個循環將那兩個“零”刪掉,可以定義一個flag標志位,將不需要輸出的數位標志位false。
三、經過第二步,結果已經變為壹億貳仟萬零零貳萬零叁佰,貌似還是有很多零,可以發現,那些有零的位置實際上真的需要輸出0,只不過太多了,那好辦,保留一個,其余的刪掉。
四、現在,結果已經變為壹億貳仟萬零貳萬零叁佰,你可能已經發現了“萬”字貌似有多余的,這里,我們需要考慮兩種情況:1.需要輸出“萬”字,那么萬位,十萬位,百萬位,千萬位至少有一個不為0,我們只保留最后一個,其余的刪掉;2.如果那些位上全是0,說明不需要輸出“萬”字,直接全部刪掉就好了。
五、然后就可以輸出了,看起來很高大上哈。
#include<iostream> #include<string> #include<cstring> #include<stdio.h> #include<memory.h> using namespace std;string uper1[10]={"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};//從0到9十個數字的大寫 string uper2[8]={"拾","佰","仟","萬","拾萬","佰萬","仟萬","億"};//各種數量級的大寫 int main() {char num[15];//用戶輸入的數據 int i,j,p=0;//p是一個指針,因為漢字沒法存到一個字符當中,所以開辟了一個string[],每個漢字是一個字符串 string result[20];//保存最終結果的數組 cin>>num;int len=strlen(num);//獲取輸入的數字的長度 for(i=0;i<len;i++)//初步處理, 直接把每一個數字表示出來,比如10200500,直接輸出 壹仟萬零貳拾萬零零伍佰零零{ //說白了就是直接輸出每個數字的值加上數量級,注意如果一個數字是0,不需要輸出它的數量級 result[p++]=uper1[(int)(num[i]-'0')];if(num[i]!='0'&&len-i-2>=0)result[p++]=uper2[len-i-2];}len=p;//保存預處理之后的結果的長度 for(i=0;i<len;i++){cout<<result[i];}cout<<endl;bool *flag=new bool[len];//給每一位數定義一個標志位,true就輸出,false就不輸出for(i=0;i<len;i++)//初始化flag flag[i]=true;for(i=len-1;i>=0&&result[i]=="零";i--)//針對1234000這種最后一位是0并且可能有連續多個0的情況,這時候只讀從后往前數 flag[i]=false; //第一個不為0的數和它的數量級,就是4千 for(;i>0;i--)//經過了上一步后,只是去除了尾部的連續多個0,現在要從上一步停止的地方繼續,掃描是否有連續多個 { //0的存在,如果有,只保留一個 if(result[i]=="零"&&result[i-1]=="零")flag[i]=false;}if(num[4]!='0'||num[5]!='0'||num[6]!='0'||num[7]!='0')//如果萬位,十萬位,百萬位,千萬位有一個不是0,那么這個萬字肯定要讀 { //所以就從后往前數,保留第一個萬字,其余的都刪掉 for(i=len-1;i>=0&&result[i]!="萬";i--){}for(i=i-1;i>=0;i--){if(result[i]=="萬")flag[i]=false;if(result[i]=="拾萬")result[i]="拾";if(result[i]=="佰萬")result[i]="佰";if(result[i]=="仟萬")result[i]="仟";}}else//如果不需要讀萬字,那就把所有的萬字都刪掉 {for(i=len-1;i>=0;i--)if(result[i]=="萬")flag[i]=false;if(result[i]=="拾萬")result[i]="拾";if(result[i]=="佰萬")result[i]="佰";if(result[i]=="仟萬")result[i]="仟";}for(i=0;i<len;i++)//可以輸出了 {if(flag[i])cout<<result[i];}cout<<endl;return 0; }
總結
以上是生活随笔為你收集整理的蓝桥杯 人民币金额大写 格式转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是Saas软件?
- 下一篇: Matlab:船舶航向舵数学模型构建