注册 登录
编程论坛 C++教室

[求助]我今天考试没有做出来的题目

思远 发布于 2007-05-23 19:52, 957 次点击
请问下如果输入一个大于等于0,小于等于9999的正整数,要输出汉字怎么办?请教下
例如:输入8002,输出应该为八千零二元

14 回复
#2
aipb20072007-05-23 21:21
这个论坛里有写过,你搜搜看!
#3
孤魂居士2007-05-23 21:50
典型题目 我也看看``
不过应该蛮简单的``
#4
kisscjy2007-05-23 22:02

呵呵,以前写过了一下~~~

现在重新发给你,不过代码里有点小问题的~~

你自己去补一下好了

#include<iostream>
using namespace std;

void main()
{
char s[10]; //设置数组,最大长度为10;

cout<<"输入数字:\t";
cin>>s;
int i=0,l=0; //设置两个记数器;


while(s[i]=='0') //防止地第一位元素为0;
{
i++;
}

for(int n=i;s[n]!='\0';) //变量L是为了记录该数字的位数;
{
l++;
n++;
}


for(;s[i]!='\0';i++) //整数部分
{
switch(s[i]) //对数字进行分类操作
{
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;
case'0':
{
if(s[i+1]=='.') break;
else if(s[i-1]!='0') {cout<<"零";break;}
}
}
if(s[i]!='0') //0的话不需要读出位数
{
switch(l) //对位数进行分类操作
{
case 9 :cout<<"亿";break;
case 8 :cout<<"千万";break;
case 7 :cout<<"百万";break;
case 6 :cout<<"十万";break;
case 5 :cout<<"万";break;
case 4 :cout<<"千";break;
case 3 :cout<<"百";break;
case 2 :cout<<"十";break;
default:break;
}
}
l--;

}
cout<<"元"; //最后输出单位“元”;

cout<<"整";
cout<<endl;
}


[此贴子已经被作者于2007-5-23 22:45:01编辑过]

#5
kisscjy2007-05-23 22:20
有点小问题~~~

当输入800的时候,

打印出来的是八百零元,而不是日常用的八百元

我等一下再去改

[此贴子已经被作者于2007-5-23 22:37:43编辑过]

#6
mp3aaa2007-05-24 03:02

........

[此贴子已经被作者于2007-5-24 3:03:22编辑过]

#7
kisscjy2007-05-24 07:42

改好了#include<iostream>
using namespace std;

void main()
{
char s[10]; //设置数组,最大长度为10;

cout<<"输入数字:\t";
cin>>s;
int i=0,l=0; //设置两个记数器;
int cheat=0;

while(s[i]=='0') //防止地第一位元素为0;
{
i++;
}

for(int n=i;s[n]!='\0';) //变量L是为了记录该数字的位数;
{
l++;
n++;
}


for(;s[i]!='\0';i++) //整数部分
{
switch(s[i]) //对数字进行分类操作
{
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;
case'0':
{
if(s[i+1]=='\0') break;
else if(s[i+1]!='0'&&l!=5) {cout<<"零";break;}
}
}
//0的话不需要读出位数

switch(l) //对位数进行分类操作
{
case 9 :if(s[i]!='0') cout<<"亿";break;
case 8 :if(s[i]!='0') cout<<"千";cheat=1;break;
case 7 :if(s[i]!='0') cout<<"百";cheat=1;break;
case 6 :if(s[i]!='0') cout<<"十";cheat=1;break;
case 5 :if(s[i]!='0'||cheat==1) cout<<"万";break;
case 4 :if(s[i]!='0') cout<<"千";break;
case 3 :if(s[i]!='0') cout<<"百";break;
case 2 :if(s[i]!='0') cout<<"十";break;
default:break;
}

l--;

}
cout<<"元"; //最后输出单位“元”;cout<<"整";
cout<<endl;
}

~~~

#8
BJSH2007-05-24 09:35

ls的代码还有一点小小的问题;
比如10应该为十元整而不应该是一十元整;
同样的问题还有11-19;


#9
zkkpkk2007-05-24 09:45
这个小问题被广泛地运用于银行的系统
#10
I喜欢c2007-05-24 10:55

以下是引用BJSH在2007-5-24 9:35:51的发言:

ls的代码还有一点小小的问题;
比如10应该为十元整而不应该是一十元整;
同样的问题还有11-19;



我觉得一十元整 也有这样说得..没错误的,

#11
mp3aaa2007-05-24 18:20

如果有8楼那样的问题的话 还有 一十万元 --- 一十九万元 其实这个问题也很好解决 只要把原来打印出来的数存储起来 然后在判断[0]==“一”&&[1]==”十“ (要用字符串比较函数)如果条件成立 就从【1】开始输出

#12
kisscjy2007-05-24 18:42

不只是这样的,
还有一十万零一十元,一百万零一十元.......
考虑到一十的情况有太多了,

何况一十的叫法是存在的...
所以我就没有修改了,
保留了一十的叫法了

#13
SNAKEQX2007-05-24 19:26
加一个预处理行不行啊?如果最高位是一,就把它标记成null,遇到null就不转换。小弟也是新手,请指教。
#14
litcatyx2007-05-24 21:38
std::string convert(int num)
{
const std::string unit[]=
{"","十","百","千","万",
"十万","百万","千万",
"亿","十亿","百亿","千亿"
};
const std::string number[]=
{"零","一","二","三","四",
"五","六","七","八","九"
};


std::string result="元";
bool prev_is_zero=true;

int pos=0;
while (num>0)
{
int i=num%10;
if (i==0)
{
if (!prev_is_zero)
{
result=number[i]+result;
}
prev_is_zero=true;
}
else
{
result=number[i]+unit[pos]+result;
prev_is_zero=false;
}

num=num/10;
++pos;
}
return result;
}

#15
aipb20072007-05-25 09:02

昨天寝室的讨论到这个题目,都在动手写,我也写了一个(任意位的):

#include <iostream>
#include <string>
using namespace std;
int main(){
const int size = 12;
const string s1[] = {"零","一","二","三","四","五","六","七","八","九"};
const string s2[] = {"","十","百","千"};
int money,a[size],beg = 0,end = 0;
cin >> money;
while (cin.fail()){
cin.clear();
cin.ignore();
cin >> money;
}
for (int i = 0;i < size;++i){
a[i] = money % 10;
money /= 10;
}
//count 0 at begin
for (int i = size-1;i >= 0;--i){
if (a[i] != 0)
break;
++beg;
}
//count 0 at end
for (int i = 0; i < size;++i){
if (a[i] != 0)
break;
++end;
}
//dispaly
for (int i = size-1-beg;i >= end;--i){
//process the situation when 0 at middle
if (i < size-1){
if (a[i+1] == 0 && a[i] == 0);
else
cout << s1[a[i]];
}
else
cout << s1[a[i]];
cout << (a[i] == 0 ? "" : s2[i%4]);
if (i == 4) cout << "万";
if (i == 8) cout << "亿";
}
cout << "元" << endl;
}

vc++6.0运行要报错的哦,改下i的定义就好,我用2005写的!

有个bug怎么也改不对(输入10001001),请教指点,按我的思路!

[此贴子已经被作者于2007-5-25 10:03:02编辑过]

1