人民币金额大写问题
問題描述
在與財務相關的應用中,經常會用到人民幣金額的大寫,比如發票的打印程序。本題的任務是:從鍵盤輸入一個十億以內的正整數(int 類型),把它轉換為人民幣金額大寫(不考慮用戶輸入錯誤的情況)
比如,用戶輸入: 35201,程序輸出:叁萬伍仟貳佰零壹
用戶輸入: 30201,程序輸出:叁萬零貳佰零
算法設計
主要是利用棧來實現,因為棧的特點是先入后出,而我們通過計算機(整除和求余)讀入是從低位到高位讀入,而輸出的時候是從高位往低位讀。關于權和零的問題,因為比較特殊當size == 4或size==8,直接輸出‘萬’、‘億’,多個零的情況可以通過一個while 來做,如果棧頂為零,就一直出棧,直到不為零,但只輸出一個“零”。
算法實現
采用棧的數據結構(簡單版本)
class numStack{ protected:int *upper; // 存每個數字int size; // 存有多少個數字 public:numstack(){upper = new int[20]; // 題目說明了最大10億size = 0;} // 構造函數~numstack(){delete []upper;} // 析構函數void Push(const int n){upper[size++] = n;return ;} // 入棧int Top(){int i = size - 1;return upper[i];} // 取棧頂元素void Pop(int &n){n = upper[size-1];size--;return ;} // 出棧int theSize(){return size;} // size 為protected類型,只能通過函數訪問主函數
int main() {int money;numstack myStack;cout<<"請輸入金額:";while(cin>>money){string upchar[9] = {"壹","貳","叁","肆","伍","陸","柒","捌","玖"};string unit[4] = {"十","百","千","萬"};int now = 0;while(money != 0){myStack.Push(money%10); // 依次入棧money = money / 10;}while(myStack.theSize()!=0){if(myStack.Top()!=0){ // 看棧頂元素是否為零myStack.Pop(now); // 是的話出棧并在下面把權表示出來cout<<upchar[now-1];if(myStack.theSize() == 8){cout<<"億";} else if (myStack.theSize()==0){cout<<"";}else{cout<<unit[(myStack.theSize()-1)%4]; // 輸出權}} else{while(myStack.Top()==0){myStack.Pop(now);if(myStack.theSize() ==4 && now==0){ // 輸出當萬位為0的時候‘萬’權cout<<"萬";}}if(myStack.theSize()!=0){cout<<"零"; // 中間的零只輸出一個}}}cout<<endl;cout<<"請輸入金額:"; // 格式控制}return 0; }總結
- 上一篇: 传说中的“群控”!云控群控、线控群控到底
- 下一篇: HTTP 403