654321 转为六十五万四千三百二十一 算法讨论

tan625747 2010-07-19 07:59:41
看谁的代码行最小

先来我的190行,还可以精解

#include <iostream>
#include <string>
using namespace std;
void math_to_chinese(int num,char * str );
void num_math(int *m,string * s,int * r);

int num_to_chinese(int num,char * ch )
{
int m[10];
string str[10],strm[10],testr;
int f,t;

char qw[13]="";
sprintf(qw,"%10d",num);
for( int i = 1 ; i <=9; i ++ )
{
m[i] = qw[i] -48;
if ( m[i] == -16 ) m[i] = 0 ;
}

for (int i = 0 ;i <= 9; i ++ )
{
math_to_chinese(m[i],(char *)str[i].c_str ());
}

for ( int i = 0 ; i <=9; i ++ )
{
strm[i] = str[i].c_str();

if ( i == 2 || i == 6 )
{
strm[i] += "千";
}
if ( i == 3 || i == 7 )
{
strm[i] += "百";
}
if ( i == 4 || i == 8 )
{
strm[i] += "十";
}
}
num_math(&m[6],&strm[6],&f);// 个,十,百,千
num_math(&m[2],&strm[2],&t);// 十万,百万,千万

string s1,s2,s3;
s1 = "亿",s2 = "万",s3 ="";
if ( m[1] == 0 )
{
strm[1] = "";
s1 = "";
if ( t == 1 )
{
s2 = "";
if ( f == 1 ) s3 = "零";// 0
}
}
else
{
if ( t == 1 )// 1 0000 1001
{
s2 = "零";
}
else
{
if ( t == 2 ||t == 3 ||t == 4 ||t == 7 ||t == 9 ||t == 11 || t== 15 ) s1 = "亿零" ;//1 0010 1001
}
}

if ( t != 1 )
{
if ( t == 2 ||t == 3 ||t == 7 ||t == 8 ||t == 9 ||t == 13 ||t == 14 || t== 15 )
{
if ( f == 2 ||f == 3 ||f == 4 ||f == 7 ||f == 9 ||f == 11 ||f== 15 ) s2 = "万零";//10101
}
if ( t == 3||t == 4 ||t == 5 ||t == 6 ||t == 10 ||t == 11 || t== 12 ) s2 = "万零"; //101001
}

if ( f == 1 )
{
if ( t == 3||t == 4 ||t == 5 )
{
s2 = "万";
}
}

if ( t == 1 && f == 1)
{
s2 = "";
}

testr = strm[1] + s1 +strm[2] + strm[3] + strm[4] + strm[5] +s2 + strm[6] + strm[7] + strm[8] + strm[9] +s3;
strcpy(ch,(char *)testr.c_str());
return 0;
}

void num_math(int * m ,string * s,int * r)
{
for (int i = 0 ; i<= 3; i ++ ) if ( m[i] == 0 ) s[i]="";
if ( m [0] == 0 && m[1] == 0 && m[2] ==0 && m[3] == 0 ) *r = 1;//0000
if ( m [0] == 0 && m[1] == 0 && m[2] ==0 && m[3] != 0 ) *r = 2;//0001
if ( m [0] == 0 && m[1] == 0 && m[2] !=0 && m[3] == 0 ) *r = 3;//0010
if ( m [0] == 0 && m[1] != 0 && m[2] ==0 && m[3] == 0 ) *r = 4;//0100
if ( m [0] != 0 && m[1] == 0 && m[2] ==0 && m[3] == 0 ) *r = 5;//1000
if ( m [0] != 0 && m[1] != 0 && m[2] ==0 && m[3] == 0 ) *r = 6;//1100
if ( m [0] == 0 && m[1] == 0 && m[2] !=0 && m[3] != 0 ) *r = 7;//0011
if ( m [0] != 0 && m[1] == 0 && m[2] ==0 && m[3] != 0 ) //1001
{
s[1] = "零";
*r = 8;
}
if ( m [0] == 0 && m[1] != 0 && m[2] ==0 && m[3] != 0 ) //0101
{
s[2] = "零";
*r = 9;
}
if ( m [0] != 0 && m[1] == 0 && m[2] !=0 && m[3] == 0 ) //1010
{
s[1] = "零";
*r = 10;
}
if ( m [0] == 0 && m[1] != 0 && m[2] !=0 && m[3] == 0 ) *r = 11;//0110
if ( m [0] != 0 && m[1] != 0 && m[2] !=0 && m[3] == 0 ) *r = 12;//1110
if ( m [0] != 0 && m[1] != 0 && m[2] ==0 && m[3] != 0 ) //1101
{
s[2] = "零";
*r = 13;
}
if ( m [0] != 0 && m[1] == 0 && m[2] !=0 && m[3] != 0 ) //1011
{
s[1] = "零";
*r = 14;
}
if ( m [0] == 0 && m[1] != 0 && m[2] !=0 && m[3] != 0 ) *r = 15;//0111

}

void math_to_chinese(int num,char * str )
{
switch(num)
{
case 0:
strcpy( str,"零");
break;
case 1:
strcpy( str,"一");
break;
case 2:
strcpy( str,"二");
break;
case 3:
strcpy( str,"三");
break;
case 4:
strcpy( str,"四");
break;
case 5:
strcpy( str,"五");
break;
case 6:
strcpy( str,"六");
break;
case 7:
strcpy( str,"七");
break;
case 8:
strcpy( str,"八");
break;
case 9:
strcpy( str,"九");
break;
}
}

int main()
{
char * resu;
resu = (char *) malloc (128 );
int number ;
cout << "请输入一个大于0且小于10亿的整数:" << endl;

while (cin >> number && number < 1000000000)
{
if (num_to_chinese(number,resu)) ;
cout << resu << endl;
}
cout << "EXIT";
free ( resu );
return 0;
}
...全文
238 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2010-07-20
  • 打赏
  • 举报
回复
楼主的代码这么长,还有错误啊!
301080 应该是 三十万四千零八十
楼主的输出为三十万零一千零八十 ,多了一个零
hanmengling629 2010-07-20
  • 打赏
  • 举报
回复
我的代码 呵呵

#include <iostream>
#include <sstream>
#include <string>
//#include <algorithm>
using namespace std;

const string a[10] = {"零","一","二","三","四","五","六","七","八","九"};
const string b[] = {"十","百","千","万","亿"};

string low_num(string str)
{
if(str.size()>4) return "";
ostringstream oss;
size_t i,len;
len = str.size();
for(i=0; i<len-1; ++i)
{
if(str[i] != '0')
{
oss << a[str[i]-'0'] << b[len-i-2];
}
else
{
oss << a[str[i]-'0'];
}
}
oss << ((str[len-1] == '0') ? "":a[str[i]-'0']);
return oss.str();
}

void exchange(const int& k)
{
size_t j,i;
int len;
ostringstream oss;
oss << k;
string temp(oss.str()),str("");
len = temp.size();
i = 3;
while(len > 0)
{
j = len>4 ? 4 : len;
str = low_num(temp.substr(len-j,j))+str;
len -= 4;
if(len > 0)
{
str = b[i++] + str;
}
}
len = str.size();
while(len > 0)
{
if(str.substr(len-2,2) == "零")
{
str.erase(len-2,len);
}
else
{
break;
}
len -= 2;
}
cout<< str << endl;
}

int main(int argc, char** argv)
{
int k;
k = 300300;
exchange(k);
}
hgxinyu 2010-07-20
  • 打赏
  • 举报
回复
似乎比你的代码好了不止一点两点

[Quote=引用 11 楼 tan625747 的回复:]

引用 8 楼 we_sky2008 的回复:

C/C++ code

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<assert.h>

int main()
{
char number[100], res[100], *result = res, *……
[/Quote]
bobo_guan 2010-07-20
  • 打赏
  • 举报
回复
mark
学习
taodm 2010-07-20
  • 打赏
  • 举报
回复
4行代码,加4行数据表,搞定的人飘过。
要之:正则表达式。
九度空间 2010-07-20
  • 打赏
  • 举报
回复
void num_math(int * m ,string * s,int * r)
{
for (int i = 0 ; i<= 3; i ++ ) if ( m[i] == 0 ) s[i]="";
if ( m [0] == 0 && m[1] == 0 && m[2] ==0 && m[3] == 0 ) *r = 1;//0000
if ( m [0] == 0 && m[1] == 0 && m[2] ==0 && m[3] != 0 ) *r = 2;//0001
if ( m [0] == 0 && m[1] == 0 && m[2] !=0 && m[3] == 0 ) *r = 3;//0010
if ( m [0] == 0 && m[1] != 0 && m[2] ==0 && m[3] == 0 ) *r = 4;//0100
if ( m [0] != 0 && m[1] == 0 && m[2] ==0 && m[3] == 0 ) *r = 5;//1000
if ( m [0] != 0 && m[1] != 0 && m[2] ==0 && m[3] == 0 ) *r = 6;//1100
if ( m [0] == 0 && m[1] == 0 && m[2] !=0 && m[3] != 0 ) *r = 7;//0011
if ( m [0] != 0 && m[1] == 0 && m[2] ==0 && m[3] != 0 ) //1001
{
s[1] = "零";
*r = 8;
}
if ( m [0] == 0 && m[1] != 0 && m[2] ==0 && m[3] != 0 ) //0101
{
s[2] = "零";
*r = 9;
}
if ( m [0] != 0 && m[1] == 0 && m[2] !=0 && m[3] == 0 ) //1010
{
s[1] = "零";
*r = 10;
}
if ( m [0] == 0 && m[1] != 0 && m[2] !=0 && m[3] == 0 ) *r = 11;//0110
if ( m [0] != 0 && m[1] != 0 && m[2] !=0 && m[3] == 0 ) *r = 12;//1110
if ( m [0] != 0 && m[1] != 0 && m[2] ==0 && m[3] != 0 ) //1101
{
s[2] = "零";
*r = 13;
}
if ( m [0] != 0 && m[1] == 0 && m[2] !=0 && m[3] != 0 ) //1011
{
s[1] = "零";
*r = 14;
}
if ( m [0] == 0 && m[1] != 0 && m[2] !=0 && m[3] != 0 ) *r = 15;//0111

}


我希望你的变量不要用一个字母来表示 真的不知道是什么意思?
aizibion 2010-07-20
  • 打赏
  • 举报
回复
mark
Ark_Xu 2010-07-19
  • 打赏
  • 举报
回复
分治
以前做 OJ 有数的朗读这么一个题
就是给一个数 然后输出它的读法 也就是楼主的要求
还可以处理小数 前导的一些字符

代码确实不长 50 行左右
tan625747 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 we_sky2008 的回复:]

C/C++ code

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<assert.h>

int main()
{
char number[100], res[100], *result = res, *p = number;
int i = 0, j = ……
[/Quote]
输入
10
就读作一拾零
ctwoz 2010-07-19
  • 打赏
  • 举报
回复
学习…
tan625747 2010-07-19
  • 打赏
  • 举报
回复
只是有人告诉我,40行能达到,所以特到这来求代码
we_sky2008 2010-07-19
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<assert.h>

int main()
{
char number[100], res[100], *result = res, *p = number;
int i = 0, j = 0;
const char *ptr[] =
{
{"零"}, {"壹"}, {"贰"}, {"叁"}, {"肆"}, {"伍"}, {"陆"}, {"柒"}, {"捌"}, {"玖"}
};
const char *unit[] =
{
{""}, {""}, {"拾"}, {"佰"}, {"仟"}, {"萬"}, {"拾"}, {"佰"}, {"仟"}, {"亿"}, {"拾"}, {"佰"}, {"仟"}, {"亿"}
};
memset(res, 0, 100);
memset(number, 0, 100);
printf("Input the number:");
scanf ("%s",number);
while (*p)
{
assert(isdigit(*p++));
i++;
}
for (j = 0; j < i; j++)
{
strcat(result, ptr[number[j] & 0xf]);
strcat(result, unit[i - j]);
}
printf ("%s\n", result);

system("pause");
return 0;
}

qq120848369 2010-07-19
  • 打赏
  • 举报
回复
这么麻烦?提前打好表,直接输出就行了。
hgxinyu 2010-07-19
  • 打赏
  • 举报
回复
这个小函数写190行也太多了吧
winingsky 2010-07-19
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090804/09/6924cc6a-15e2-4740-8800-daaef909a69e.html四楼的代码很短哦
bjgxqm 2010-07-19
  • 打赏
  • 举报
回复
不超过10行。
ypb362148418 2010-07-19
  • 打赏
  • 举报
回复
支持下
G_Spider 2010-07-19
  • 打赏
  • 举报
回复
先做个记号,留着做做,嘿嘿,,,有点创意
jbz001 2010-07-19
  • 打赏
  • 举报
回复
写的不错~!

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧