| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3700 人关注过本帖
标题:[求助]编一个把数字转化成汉字念法的程序
只看楼主 加入收藏
zwn2006
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-6-16
收藏
得分:0 
呵呵!!就是有个关于零的问题!不管怎么说,太谢谢了,兄弟!!!
2006-09-25 20:40
C_Student
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-9-13
收藏
得分:0 

对啊,中文的”零”很难处理的,多一位数要处理程序不只多一行,
如果到6位数还好,第4楼有再修正过,再上了限制最大值的功能,
不然超过6个就会误判,但程序还是Dev-C++的,因为VC++ 6不会用= =

2006-09-25 20:50
chiy2k
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-9-15
收藏
得分:0 
我前两天刚写过一个,
关于零,我是这样处理的,将数字存入数组中,对应数组下标的单位不变,当当前数组中值为0时,与后面一位比较,如后面一位也为0,则不输出零,如后面一位不为零,则输出0,但当为零时,在对应单位为万时不输出零,就是这个思路,你可以自己编写试下





2006-09-26 14:02
C_Student
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-9-13
收藏
得分:0 

嗯,这个方法试过了,但是到 ”千万” 会很难,
“零”的组合会非常多,10000003….1000013…
1000103….1001003…..好多…”亿”以上就不敢领教了,
我想可能有更好的方法….


构想是整个转换成中文字后,再比对字符串方式,
过滤掉”零零”…”零万”…”零千”…”零百”..这类的…
但是才学没多久,不知哪些语法可以这么用…
输出一个过滤一个的方式,位数太大的话,不是一个好方法…

2006-09-26 16:50
C_Student
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-9-13
收藏
得分:0 
//修正了N次,应该可以了吧@@

//终于搞定了,8位数(千万)的转换…
//即然都讨论到这了,成果就分享给大家吧
//请用 Dev-C++ 来编译,MS-VC++ 6 大概不能用.
//而我也不懂VC++ 6….程序不知有什么潜在问题,
//目前是没找到bug,因为数目太大了,无法一个一个测.

//请用 Dev-C++ 来编译
#include <iostream>
#include <climits> //限制 int qX 范围为int最大值,避免输入的数目太大,造成程序误判.
using namespace std;
string aX(int); //自定函数

int main()
{
int qX = INT_MAX; //储存输入值,并限范围为int最大值.
int x0,x1,x2,x3,x4,x5,x6,x7;

// 个位数~万位数,万位数~千万位数(值:1/0 ,1=是/0=否)
int zeroX;
int a1; //万位数到千万位数 判断万位数是否有数值. 1=有 ,0=无

string ch0,ch1,ch2,ch3,ch4,ch5,ch6,ch7;
string ok1,ok2; //万以下,万以上

//使用者轮入
cout <<"请输入数字(8位数内): ";
cin >> qX;
if(qX>99999999){cout <<"位数太大或格式不正确" <<endl; return 0;}

//单位转换
x7 = qX/10000000; //千万
x6 = qX%10000000/1000000; //百万
x5 = qX%10000000%1000000/100000; //十万
x4 = qX%10000000%1000000%100000/10000; //万
x3 = qX%10000000%1000000%100000%10000/1000; //1万的余数就是千,有几千呢?? ,再除以1000就是了.
x2 = qX%10000000%1000000%100000%10000%1000/100; //万的余数是千,千的余数剩百,几百再除以100就是了.
x1 = qX%10000000%1000000%100000%10000%1000%100/10;//同上推演下来...
x0 = qX%10000000%1000000%100000%10000%1000%100%10;//同上推演下来...

//千万位数转中文
if(x7!=0){ch7 = aX(x7);} //aX(x7)呼叫自定函数处理数据,并返回结果值.

//百万位数转中文
if(x6!=0){ch6 = aX(x6);}

//十万位数转中文
if(x5!=0){ch5 = aX(x5);}

//万位数转中文
if(x4!=0){ch4 = aX(x4);}

//千位数转中文
if(x3!=0){ch3 = aX(x3);}

//百位数转中文
if(x2!=0){ch2 = aX(x2);}

//十位数转中文
if(x1!=0){ch1 = aX(x1);}

//个位数转中文
if(x0!=0){ch0 = aX(x0);}

//以下为显示结果,"零"特殊处理
zeroX = x0+x1+x2+x3;

//千万位数处理
if(x7!=0){ok2 = ok2+ch7+"千",a1=1;}
if(x7==0){ok2 = "",a1=0;} //位数0则空白,a1=0 (万位数目前为0)

//百万位数处理
if(x7!=0 && x6!=0){ok2 = ok2+ch6+"百",a1=1;}
if(x7==0 && x6!=0){ok2 = ok2+ch6+"百",a1=1;}
if(x7==0 && x6==0){ok2 = "",a1=0;} //千万和百万位数为0,则a1=0 (万位数目前为0)
if(x7!=0 && x7!=0 && x6==0 && x5+x4!=0){ok2 = ok2+"零",a1=1;}

//十万位数
if(x7+x6!=0 && x5!=0){ok2 = ok2+ch5+"十",a1=1;}
if(x7+x6==0 && x5!=0){ok2 = ok2+ch5+"十",a1=1;}
if(x7+x6==0 && x5==0){ok2 = "",a1=0;}//千万和百万和十万位数皆为0
if(x7+x6!=0 && x6!=0 && x5==0 && x4!=0){ok2 = ok2+"零";}

//万位数 -----------------
if(x7+x6+x5!=0 && x4!=0){ok2 = ok2+ch4,a1=1;}//万
if(x7+x6+x5==0 && x4!=0){ok2 = ok2+ch4,a1=1;}
if(x7+x6+x5==0 && x4==0){ok2 = "",a1=0;}//千万和百万和十万和万位数皆为0

//注: al=0的部份,在ok2中都会填上空白,在最后结果就不会显示该位数
//ok2 是存万位以上单位的结果值, ok1是千位数以下结果存放.

if(a1==1){ok2 = ok2+"万";} //万的显示时机运算

//万和千位数交接地方的特别处理
if(x4==0 && x3!=0 && a1==1){ok1 = ok1 +"零";}
//if(x4==0 && x6!=0 && x5==0 && x3!=0){ok1="";} //特级处理
//if(x4==0 && x6==0 && x5==0 && x3!=0){ok1="";} //特级处理
//if(x4==0 && x6==0 && x5!=0 && x3!=0){ok1="";} //特级处理
//if(x4==0 && x6!=0 && x5!=0 && x3!=0){ok1="";} //特级处理


//个位到千位数处理

//千位数
if(x3!=0){ok1 = ok1+ch3+"千";}
if(a1==1 && x3==0 && x2+x1+x0!=0){ok1 = ok1 +"零";}

//百位数
if(x2!=0){ok1 = ok1+ch2+"百";}
if(x3!=0 && x2==0 && x0+x1!=0){ok1 = ok1 +"零";}

//十位数
if(x1!=0){ok1 = ok1+ch1+"十";}
if(x2!=0 && x1==0 && x0!=0){ok1 = ok1 +"零";}

//个位数
if(x0!=0){ok1 = ok1+ch0;}
if(x0==0 && a1==0 && zeroX==0){cout <<"零";}

cout << ok2+ok1 <<endl; //ok2为千万到万处理结果 + ok1为千位数到个位数处理结果

return 0;
}

//转中文专用
string aX (int ok) //自定函数内容,在int main()中以aX(数值)来呼叫使用.
//数值填入要转换的单位值,如个位数是x0,则aX(x0).
{
string aa; //存放转换结果暂存区
switch(ok) //代入要转换的值
{
//case 0:
// aa="零";
//break;

case 1: //代入数值为 1 时,则处理这个程序
aa="一";
break;

case 2: //代入数值为 2 时,则处理这个程序
aa="二";
break;

case 3: //代入数值为 3 时,则处理这个程序
aa="三";
break;

case 4: //代入数值为 4 时,则处理这个程序
aa="四";
break;

case 5: //代入数值为 5 时,则处理这个程序
aa="五";
break;

case 6: //同上类推....
aa="六";
break;

case 7:
aa="七";
break;

case 8:
aa="八";
break;

case 9:
aa="九";
break;

return aa; //把结果传回int main程序代码中的呼叫位置,如aX(x7)结果就是这里的值
}
}

[此贴子已经被作者于2006-9-27 5:36:22编辑过]

2006-09-26 20:27
C_Student
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-9-13
收藏
得分:0 
//此为MS-C++ 6.0版本
//同为第15楼Dev-C++思考逻辑,转移过来的.
//第15楼和这篇应该是最终版本了.

#include <iostream>
#include <string>
#include <climits> //限制 int qX 范围为int最大值,避免输入的数目太大,造成程序误判.

int main()
{
using namespace std;
int qX = INT_MAX; //储存输入值,并限范围为int最大值.
int x0,x1,x2,x3,x4,x5,x6,x7;

// 个位数~万位数,万位数~千万位数(值:1/0 ,1=是/0=否)
int zeroX;
int a1; //万位数到千万位数 判断万位数是否有数值. 1=有 ,0=无

string ch0,ch1,ch2,ch3,ch4,ch5,ch6,ch7;
string ok1,ok2; //万以下,万以上

cout <<"请输入数字(8位数内): ";
cin >> qX;

if(qX>99999999){cout <<"位数太大或格式不正确" <<endl; return 0;}

//单位转换
x7 = qX/10000000; //千万
x6 = qX%10000000/1000000; //百万
x5 = qX%10000000%1000000/100000; //十万
x4 = qX%10000000%1000000%100000/10000; //万
x3 = qX%10000000%1000000%100000%10000/1000; //1万的余数就是千,有几千呢?? ,再除以1000就是了.
x2 = qX%10000000%1000000%100000%10000%1000/100; //万的余数是千,千的余数剩百,几百再除以100就是了.
x1 = qX%10000000%1000000%100000%10000%1000%100/10;//同上推演下来...
x0 = qX%10000000%1000000%100000%10000%1000%100%10;//同上推演下来...

string aa0,aa1,aa2,aa3,aa4,aa5,aa6,aa7;
//千万位数
if(x7 == 0){aa7="零";}
if(x7 == 1){aa7="一";}
if(x7 == 2){aa7="二";}
if(x7 == 3){aa7="三";}
if(x7 == 4){aa7="四";}
if(x7 == 5){aa7="五";}
if(x7 == 6){aa7="六";}
if(x7 == 7){aa7="七";}
if(x7 == 8){aa7="八";}
if(x7 == 9){aa7="九";}

//百万位数
if(x6 == 0){aa6="零";}
if(x6 == 1){aa6="一";}
if(x6 == 2){aa6="二";}
if(x6 == 3){aa6="三";}
if(x6 == 4){aa6="四";}
if(x6 == 5){aa6="五";}
if(x6 == 6){aa6="六";}
if(x6 == 7){aa6="七";}
if(x6 == 8){aa6="八";}
if(x6 == 9){aa6="九";}

//十万位数
if(x5 == 0){aa5="零";}
if(x5 == 1){aa5="一";}
if(x5 == 2){aa5="二";}
if(x5 == 3){aa5="三";}
if(x5 == 4){aa5="四";}
if(x5 == 5){aa5="五";}
if(x5 == 6){aa5="六";}
if(x5 == 7){aa5="七";}
if(x5 == 8){aa5="八";}
if(x5 == 9){aa5="九";}

//万位数
if(x4 == 0){aa4="零";}
if(x4 == 1){aa4="一";}
if(x4 == 2){aa4="二";}
if(x4 == 3){aa4="三";}
if(x4 == 4){aa4="四";}
if(x4 == 5){aa4="五";}
if(x4 == 6){aa4="六";}
if(x4 == 7){aa4="七";}
if(x4 == 8){aa4="八";}
if(x4 == 9){aa4="九";}

//千位数
if(x3 == 0){aa3="零";}
if(x3 == 1){aa3="一";}
if(x3 == 2){aa3="二";}
if(x3 == 3){aa3="三";}
if(x3 == 4){aa3="四";}
if(x3 == 5){aa3="五";}
if(x3 == 6){aa3="六";}
if(x3 == 7){aa3="七";}
if(x3 == 8){aa3="八";}
if(x3 == 9){aa3="九";}

//百位数
if(x2 == 0){aa2="零";}
if(x2 == 1){aa2="一";}
if(x2 == 2){aa2="二";}
if(x2 == 3){aa2="三";}
if(x2 == 4){aa2="四";}
if(x2 == 5){aa2="五";}
if(x2 == 6){aa2="六";}
if(x2 == 7){aa2="七";}
if(x2 == 8){aa2="八";}
if(x2 == 9){aa2="九";}

//十位数
if(x1 == 0){aa1="零";}
if(x1 == 1){aa1="一";}
if(x1 == 2){aa1="二";}
if(x1 == 3){aa1="三";}
if(x1 == 4){aa1="四";}
if(x1 == 5){aa1="五";}
if(x1 == 6){aa1="六";}
if(x1 == 7){aa1="七";}
if(x1 == 8){aa1="八";}
if(x1 == 9){aa1="九";}

//个位数
if(x0 == 0){aa0="零";}
if(x0 == 1){aa0="一";}
if(x0 == 2){aa0="二";}
if(x0 == 3){aa0="三";}
if(x0 == 4){aa0="四";}
if(x0 == 5){aa0="五";}
if(x0 == 6){aa0="六";}
if(x0 == 7){aa0="七";}
if(x0 == 8){aa0="八";}
if(x0 == 9){aa0="九";}

//以下为显示结果,"零"特殊处理
zeroX = x0+x1+x2+x3;//千位以下不能为0.

//千万位数处理
if(x7!=0){ok2 = ok2+aa7+"千",a1=1;}
if(x7==0){ok2 = "",a1=0;} //位数0则空白,a1=0 (万位数目前为0)

//百万位数处理
if(x7!=0 && x6!=0){ok2 = ok2+aa6+"百",a1=1;}
if(x7==0 && x6!=0){ok2 = ok2+aa6+"百",a1=1;}
if(x7==0 && x6==0){ok2 = "",a1=0;} //千万和百万位数为0,则a1=0 (万位数目前为0)
if(x7!=0 && x7!=0 && x6==0 && x5+x4!=0){ok2 = ok2+"零",a1=1;}

//十万位数
if(x7+x6!=0 && x5!=0){ok2 = ok2+aa5+"十",a1=1;}
if(x7+x6==0 && x5!=0){ok2 = ok2+aa5+"十",a1=1;}
if(x7+x6==0 && x5==0){ok2 = "",a1=0;}//千万和百万和十万位数皆为0
if(x7+x6!=0 && x6!=0 && x5==0 && x4!=0){ok2 = ok2+"零";}

//万位数 -----------------
if(x7+x6+x5!=0 && x4!=0){ok2 = ok2+aa4,a1=1;}//万
if(x7+x6+x5==0 && x4!=0){ok2 = ok2+aa4,a1=1;}
if(x7+x6+x5==0 && x4==0){ok2 = "",a1=0;}//千万和百万和十万和万位数皆为0

//注: al=0的部份,在ok2中都会填上空白,在最后结果就不会显示该位数
//ok2 是存万位以上单位的结果值, ok1是千位数以下结果存放.

if(a1==1){ok2 = ok2+"万";} //万的显示时机运算

//万和千位数交接地方的特别处理
if(x4==0 && x3!=0 && a1==1){ok1 = ok1 +"零";}
//if(x4==0 && x6!=0 && x5==0 && x3!=0){ok1="";}//特级处理
//if(x4==0 && x6==0 && x5==0 && x3!=0){ok1="";}//特级处理
//if(x4==0 && x6==0 && x5!=0 && x3!=0){ok1="";}//特级处理
//if(x4==0 && x6!=0 && x5!=0 && x3!=0){ok1="";}//特级处理

//加上4行特级处理: 有加和没加的差别
//有: 10001234 => 一千万一千二百三十四
//无: 10001234 => 一千万零一千二百三十四 (多一个"零")

//个位到千位数处理

//千位数
if(x3!=0){ok1 = ok1+aa3+"千";}
if(a1==1 && x3==0 && x2+x1+x0!=0){ok1 = ok1 +"零";}

//百位数
if(x2!=0){ok1 = ok1+aa2+"百";}
if(x3!=0 && x2==0 && x0+x1!=0){ok1 = ok1 +"零";}

//十位数
if(x1!=0){ok1 = ok1+aa1+"十";}
if(x2!=0 && x1==0 && x0!=0){ok1 = ok1 +"零";}

//个位数
if(x0!=0){ok1 = ok1+aa0;}
if(x0==0 && a1==0 && zeroX==0){cout <<"零";}

cout << ok2+ok1 <<endl; //ok2为千万到万处理结果 + ok1为千位数到个位数处理结果

return 0;
}


[此贴子已经被作者于2006-9-27 5:34:25编辑过]

2006-09-26 20:32
zwn2006
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-6-16
收藏
得分:0 
不好意思,前几天国庆节一直没时间来看!!
哇!!这个程序很完美了!真是高手哇!!
太谢谢拉!!
2006-10-10 20:29
zwn2006
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-6-16
收藏
得分:0 
对了,能告诉我你的油箱吗?以后还会有很多问题要请教高手的!!
我的是:ghostzwn2008@126.com
有时间发个邮件给我就好了!
2006-10-10 20:39
bluesky1322
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-10-11
收藏
得分:0 
百家争鸣,百花齐放

2006-10-11 14:10
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 

#include <iostream>
using namespace std;
void f(int n,int a[],int &i)
{
if(n < 10)
{
a[i++] = n;
return ;
}
f(n/10,a,i);
a[i++] = n%10;
}

void f1(int i)//这里也可以用map容器
{
switch(i)
{
case 0:
cout<<"零";
break;
case 1:
cout<<"一";
break;
case 2:
cout<<"二";
break;
case 3:
cout<<"三";
break;
case 4:
cout<<"四";
break;
case 5:
cout<<"五";
break;
case 6:
cout<<"六";
break;
case 7:
cout<<"七";
break;
case 8:
cout<<"八";
break;
case 9:
cout<<"九";
break;

default:
break;
}
}
void f2(int i)//也可以用容器来做
{
switch(i)
{
case 2:
case 6:

cout<<"十";
break;
case 3:
case 7:

cout<<"百";
break;
case 4:
case 8:

cout<<"千";
break;
case 5:
cout<<"万";
break;
case 9:
cout<<"亿";
break;
default:
break;
}
}
int main()
{
int a[50],n =0;
unsigned long m;
cin>>m;
f(m,a,n);
for(int j = 0;j < n;j++)
{
f1(a[j]);
f2(n-j);
}
cout<<endl;
return 0;
}

范围是1到9999万

[此贴子已经被作者于2006-10-13 17:50:50编辑过]


2006-10-11 18:04
快速回复:[求助]编一个把数字转化成汉字念法的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021268 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved