C++ 人民币转换为大写的一道题
小弟昨晚为此题战了一晚上,仍是没过。惨愧……有兴趣的帮看下程序,所剩30分全部奉上。题目:银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请...
小弟昨晚为此题战了一晚上,仍是没过。 惨愧…… 有兴趣的帮看下程序,所剩30分全部奉上。
题目:
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为:
零壹贰叁肆伍陆柒捌玖拾佰仟万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
输入
第一行为测试数据的组数n,后面有n个测试数据。每组测试数据一行,为一个绝对值不超过(10^8 - 1)的整数。
输出
对于每组测试数据,输出一行,即相应的人民币大写表示。
输入示例
2
10101
34
输出示例
壹万零壹佰零壹圆
叁拾肆圆
我的代码:
#include<iostream>
#include<map>
using namespace std;
int main(){
int n,x;
int i,j;
int a[10],b[10];
char* c[8];
c[0]="圆";
c[1]="拾";
c[2]="佰";
c[3]="仟";
c[4]="万";
c[5]="舍";
c[6]="佰";
c[7]="仟";
map<int,string>f;
map<int,string>::iterator iter;
f.insert(map<int, string>::value_type (0,"零"));
f.insert(map<int, string>::value_type (1,"壹"));
f.insert(map<int, string>::value_type (2,"贰"));
f.insert(map<int, string>::value_type (3,"参"));
f.insert(map<int, string>::value_type (4,"肆"));
f.insert(map<int, string>::value_type (5,"伍"));
f.insert(map<int, string>::value_type (6,"陆"));
f.insert(map<int, string>::value_type (7,"柒"));
f.insert(map<int, string>::value_type (8,"捌"));
f.insert(map<int, string>::value_type (9,"玖"));
cin>>n;
while(n--){
cin>>x;
if(x==0){ cout<<"零圆"<<endl; continue; }
if(x<0){ cout<<"负"; x*=-1; }
for(i=0;x/10;i++){ a[i]=x%10; x/=10; }
a[i]=x;
while(i>=0)
{
if(a[i]==0){
if(i>=4)
{
for(;a[i]==0&&i>=4;i--);
if(i==3){
cout<<c[4];
if(a[3]!=0) cout<<f[0];
}
else cout<<f[0];
}
else
{
for(;a[i]==0&&i>=0;i--);
if(i==-1) cout<<c[0];
else cout<<f[0];
}
continue;
}
iter=f.find(a[i]);
cout<<iter->second<<c[i];
i--;
}
cout<<endl;
}
return 0;
}
仅仅是想学习,望大牛们指教。 看我还有哪里没想到~~ 展开
题目:
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为:
零壹贰叁肆伍陆柒捌玖拾佰仟万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
输入
第一行为测试数据的组数n,后面有n个测试数据。每组测试数据一行,为一个绝对值不超过(10^8 - 1)的整数。
输出
对于每组测试数据,输出一行,即相应的人民币大写表示。
输入示例
2
10101
34
输出示例
壹万零壹佰零壹圆
叁拾肆圆
我的代码:
#include<iostream>
#include<map>
using namespace std;
int main(){
int n,x;
int i,j;
int a[10],b[10];
char* c[8];
c[0]="圆";
c[1]="拾";
c[2]="佰";
c[3]="仟";
c[4]="万";
c[5]="舍";
c[6]="佰";
c[7]="仟";
map<int,string>f;
map<int,string>::iterator iter;
f.insert(map<int, string>::value_type (0,"零"));
f.insert(map<int, string>::value_type (1,"壹"));
f.insert(map<int, string>::value_type (2,"贰"));
f.insert(map<int, string>::value_type (3,"参"));
f.insert(map<int, string>::value_type (4,"肆"));
f.insert(map<int, string>::value_type (5,"伍"));
f.insert(map<int, string>::value_type (6,"陆"));
f.insert(map<int, string>::value_type (7,"柒"));
f.insert(map<int, string>::value_type (8,"捌"));
f.insert(map<int, string>::value_type (9,"玖"));
cin>>n;
while(n--){
cin>>x;
if(x==0){ cout<<"零圆"<<endl; continue; }
if(x<0){ cout<<"负"; x*=-1; }
for(i=0;x/10;i++){ a[i]=x%10; x/=10; }
a[i]=x;
while(i>=0)
{
if(a[i]==0){
if(i>=4)
{
for(;a[i]==0&&i>=4;i--);
if(i==3){
cout<<c[4];
if(a[3]!=0) cout<<f[0];
}
else cout<<f[0];
}
else
{
for(;a[i]==0&&i>=0;i--);
if(i==-1) cout<<c[0];
else cout<<f[0];
}
continue;
}
iter=f.find(a[i]);
cout<<iter->second<<c[i];
i--;
}
cout<<endl;
}
return 0;
}
仅仅是想学习,望大牛们指教。 看我还有哪里没想到~~ 展开
1个回答
展开全部
#include "stdafx.h"
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
// 将数字对应的中文返回
string GetCName(int nVal, int nUnit)
{
// 根据当前位置判断额度与单位
string ArrCName[] = {"零", "壹", "贰", "参", "肆", "伍", "陆", "柒", "捌", "玖"};
string ArrUnit[] = {"元", "拾", "佰", "仟", "万", "舍", "佰", "仟"};
// 合并
string strTemp;
if (nVal == 0) // 防止出现零万零佰等情况,还有很多其它情况
strTemp = ArrCName[nVal];
else
strTemp = ArrCName[nVal] + ArrUnit[nUnit];
return strTemp;
}
int main()
{
int nVal; // 阿拉伯
string strVal; // 中文
cout<<"请输出额度:";
cin>>nVal;
// 把数据与10相取并取余逐位判断
int nUnit=0; // 单位仟,万什么的
while (nVal != 0)
{
int nRemainder; // 余数
nRemainder = nVal%10;
nVal = nVal / 10;
strVal = GetCName(nRemainder, nUnit++) + strVal;
}
cout<<strVal<<endl;
return 0;
}
我没有直接用你的代码,而是新写了一段,我觉得这个题还是比较有意思的
转换到中文后还会有很多种情况我就没有一一进行判断,像1000001会出现很多零呀什么,你自己来做吧,对防错也没有进行处理,有需要自己加,主要是交流思路
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
// 将数字对应的中文返回
string GetCName(int nVal, int nUnit)
{
// 根据当前位置判断额度与单位
string ArrCName[] = {"零", "壹", "贰", "参", "肆", "伍", "陆", "柒", "捌", "玖"};
string ArrUnit[] = {"元", "拾", "佰", "仟", "万", "舍", "佰", "仟"};
// 合并
string strTemp;
if (nVal == 0) // 防止出现零万零佰等情况,还有很多其它情况
strTemp = ArrCName[nVal];
else
strTemp = ArrCName[nVal] + ArrUnit[nUnit];
return strTemp;
}
int main()
{
int nVal; // 阿拉伯
string strVal; // 中文
cout<<"请输出额度:";
cin>>nVal;
// 把数据与10相取并取余逐位判断
int nUnit=0; // 单位仟,万什么的
while (nVal != 0)
{
int nRemainder; // 余数
nRemainder = nVal%10;
nVal = nVal / 10;
strVal = GetCName(nRemainder, nUnit++) + strVal;
}
cout<<strVal<<endl;
return 0;
}
我没有直接用你的代码,而是新写了一段,我觉得这个题还是比较有意思的
转换到中文后还会有很多种情况我就没有一一进行判断,像1000001会出现很多零呀什么,你自己来做吧,对防错也没有进行处理,有需要自己加,主要是交流思路
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询