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;
}
...全文
358 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
  • 打赏
  • 举报
回复
写的不错~!
摘 要 针对高校教师教学业绩管理流程复杂、数据填报不规范、多级审核效率低、统计分析滞后等问题,本文设计并实现一套基于SpringBoot+Vue前后端分离架构的高校教师教学业绩综合管理系统。系统后端以SpringBoot处理业务逻辑与接口开发,前端用Vue构建交互界面,MySQL存储数据,MD5加密保障账号安全,具备低耦合、易扩展、易维护特性。 系统按权限划分为教师、学院管理员、学校管理员三级角色,构建闭环式业绩管理体系。教师可完成信息维护、业绩录入、成果申报、审核跟踪、档案导出、智能咨询与社区互动;学院管理员负责教师管理、业绩初审、数据汇总、通知发布与修正申请;学校管理员承担权限分配、数据维护、业绩终审、统计分析、公告发布与日志审计。 系统实现业绩填报、初审、终审、统计归档全流程线上化,支持批量导入、敏感词过滤、数据可视化、7×24小时AI咨询等功能,规范管理流程、减少统计误差、提升审核效率。测试表明,系统满足高校教学业绩精细化、规范化、信息化管理需求,为教师考核、绩效评定、教学评估提供数据支撑,提升高校教学管理智能化水平。 关键词: SpringBoot;Vue;教学业绩管理;三级权限;前后端分离
内容概要:本文围绕“基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性研究”展开,通过Matlab代码实现双机械臂系统的协同运动控制与轨迹跟踪。研究采用雅可比伪逆法求解冗余机械臂的逆运动学问题,实现末端执行器在笛卡尔空间中的精确轨迹规划,并引入迭代优化机制提升双臂协同作业的精度与稳定性。重点分析了轨迹跟踪过程中误差的收敛特性,验证了所提控制算法在多自由度强耦合系统中的有效性和鲁棒性,适用于复杂环境下需要高精度配合的机器人协同操作任务。该研究属于科研仿真复现类工作,融合了机器人运动学理论、数值计算方法与控制算法设计,为多机械臂系统提供了可行的轨迹规划与控制策略参考。; 适合人群:具备扎实的机器人学基础、自动控制理论知识以及良好Matlab编程能力的科研人员或研究生,尤其适合从事多机械臂协同控制、运动规划、逆运动学求解及误差分析等方向的研究者。; 使用场景及目标:①用于多机械臂系统的协同轨迹规划与运动控制算法研究;②深入理解基于雅可比伪逆法的逆运动学求解原理及其在冗余机构中的应用;③分析轨迹跟踪误差的收敛行为,评估控制策略的稳定性与精度;④作为高质量论文复现资源,支撑相关课题的仿真验证、算法对比与改进创新。; 阅读建议:建议结合Matlab代码与机器人运动学经典理论同步学习,重点关注雅可比矩阵的构建、伪逆运算的实现方式、误差反馈机制的设计以及迭代过程中的数值稳定性处理,同时可进一步拓展至非线性优化、避免奇异位形及实时控制策略的改进研究。

65,214

社区成员

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

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