【经典算法】:银行金额大写转换

来源:互联网 发布:小号 软件 编辑:程序博客网 时间:2024/06/15 17:25

说明

//你很可能看不懂我写的什么,但是代码可以直接用,不用谢我

这篇文章的起因是我想写一个编译原理的工具,后来我顺便想到了字符对应,于是我脑洞大开,就想到了这个银行大写金额转换的工具。

思路跟我的上篇博客那个罗马数字的转换也是一回事

噢,对了,为了防止来到本博客的小伙伴还不知道我讲的什么,我决定讲下这个程序的功能。
实现了 把银行票据上的数字转换为中文金额

比如: 输入31655427 就会显示 叁仟壹佰陆拾伍万伍仟肆佰二拾柒

思路(看看就行,可以自己实现,好懂)

思路如下:

1)不管金额多少位,都是4位后变成万,8位后变成亿,然后按照这个规律不断的进行循环
2)写一个四位数的输出函数c_out(); c_out实现了给出四位数就能把四位数翻译成 中文输出
3)逻辑上的控制,先把金额的各位分离,然后进行逻辑上的控制进行“万”,“亿”等字符的匹配输出

技巧及注意事项:
1)分离金额,假设该数是n,用num数组去接各位

int count=0;whiel(n){    num[++count] = n%10;    n/=10;}

这样就能达到分离的目的了

2)关于四位数翻译函数
写的时候要注意几点
1000 会输出 壹仟 1001 会输出 壹仟零壹
这种特例要特殊考虑

代码(直接用吧,写的复杂,一下讲不明白)

#include <iostream>using namespace std;int num[100];void trans(int temp){    if(temp==1) cout<<"壹";    if(temp==2) cout<<"贰";    if(temp==3) cout<<"叁";    if(temp==4) cout<<"肆";    if(temp==5) cout<<"伍";    if(temp==6) cout<<"陆";    if(temp==7) cout<<"柒";    if(temp==8) cout<<"捌";    if(temp==9) cout<<"玖";    if(temp==0) cout<<"拾";}void c_out(int a,int b,int c,int d){    if(a!=0 && b ==0 &&c==0 &&d ==0){        trans(a);        cout<<"仟";    }    else  if(a!=0 && b==0 && c==0 && d!=0){        trans(a);        cout<<"千";        cout<<"零";        trans(d);    }    else if(a!=0 && b!=0 &&c==0 &&d==0){        trans(a);        cout<<"仟";        trans(b);        cout<<"佰";    }    else if(a==0 && b!=0){        trans(b);        cout<<"佰";        if(c==0)trans(c);        else{            trans(c);            cout<<"拾";        }        if(d==0){}        else{            trans(d);        }    }    else if(a==0 && b==0 && c!=0) {         trans(c);        cout<<"拾";        if(d==0){}        else{            trans(d);        }    }    else if(a==0 && b==0 && c==0) trans(d);    else{        trans(a);        cout<<"仟";        if(b==0)trans(b);        else{            trans(b);            cout<<"佰";        }        if(c==0)trans(c);        else{            trans(c);            cout<<"拾";        }        if(d==0){}        else{            trans(d);        }    }}void separate(int n){    int d = n%10;    int c = n/10%10;    int b = n/100%10;    int a = n/1000;    c_out(a,b,c,d);}int main(){    int n,count=0;    cin>>n;    while(n){        num[++count] = n%10;        n/=10;    }    int left  = count%4;    if(left!=0){        for(int i=count+1;i<=count+4-left;i++){            num[i] = 0;        }    i = count+4-left;    c_out(num[i],num[i-1],num[i-2],num[i-3]);    for(i=count-left;i>0;i-=4){        if(i%8==0) cout<<"亿";        if(i%8==4) cout<<"万";        c_out(num[i],num[i-1],num[i-2],num[i-3]);    }    }    if(left==0){        int i = count;        c_out(num[i],num[i-1],num[i-2],num[i-3]);        for(i=count-left-4;i>0;i-=4){            if(i%8==0) cout<<"亿";            if(i%8==4) cout<<"万";            c_out(num[i],num[i-1],num[i-2],num[i-3]);        }    }}

运行截图

这里写图片描述

此程序的优点与问题

优点:
1)能实现%99的票据内容转换,日常应用没有问题
2)简单方便

问题:
1)我用的是Int型存储银行金额,所以位数不能超过int型的位数
2)有些金额中间空一大串0没有输出最正统的中文格式,但是还是对的,比如 10000 0001 会输出 壹亿零万壹

综上所述,此程序还是很好的,放心使用

0 0
原创粉丝点击