博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【经典算法】:银行金额大写转换
阅读量:3706 次
发布时间:2019-05-21

本文共 2905 字,大约阅读时间需要 9 分钟。

说明

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

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

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

噢,对了,为了防止来到本博客的小伙伴还不知道我讲的什么,我决定讲下这个程序的功能。

实现了 把银行票据上的数字转换为中文金额

比如: 输入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 
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 会输出 壹亿零万壹

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

你可能感兴趣的文章
图解排序算法之堆排序
查看>>
二分查找
查看>>
BFS问题及相关应用
查看>>
LeetCode中经典的排序问题
查看>>
拓扑排序
查看>>
LeetCode中典型的DFS问题
查看>>
MySQL事务和隔离级别
查看>>
LeetCode中有关哈希表问题
查看>>
计算机网络学习笔记
查看>>
完美代价(贪心算法)
查看>>
矩阵乘法
查看>>
时间转化·
查看>>
二进制数数
查看>>
蓝桥杯大小写转换
查看>>
字符串合并
查看>>
贪心算法
查看>>
斐波那契数列
查看>>
java蓝桥杯2017年A组
查看>>
编写代码与初步运行
查看>>
汇编语言之debug篇
查看>>