c语言数字储存于变量,用C语言写中文数字字符串转数值变量

本文探讨了如何使用C语言将中文数字字符串转换为数值变量,处理了中文数字的各种组合形式,如‘一亿三千五百万’、‘一三零’等。通过建立单位和对应数值的映射,整理输入的中文数字顺序,然后递归整合数字和单位,最终实现转换。代码示例展示了具体实现过程。
摘要由CSDN通过智能技术生成

用C语言写中文数字字符串转数值变量

C语言写中文数字字符转数值变量

最近突发奇想:程序中要是输入一串中文数字,如“十万”就能自动识别转换成数值100000储存到变量里该多好。

也许你会说,那很简单啊,先将中文字符分开,再各自识别成数值,最后乘上位数相加就行了。可是实际操作时你会发现这并不容易。比如“一亿三千五百万”中,如何确定“三”属于千万位的?或者我想让程序更智能化一些,同时实现如“一百三十”=“一三零”=“1百3”=“百三”=130,那就不会那么简单了。

为了实现这一转换,可以按以下思路编写:

1.可以用两个数组分别储存单位和每个单位对应的数字。其中不同的单位用不同的数值标识。再记录下下标长度。

2.然后将输入的中文数字整理成这种形式:*万*百*个。其中*代表一个正整数(可以大于10),万、百、个代表单位。比如:“一亿五十六万三千”整理成1亿56万3千。这个过程最好使用递归。接着可以将数值相乘叠加。

3.最后,为了处理如“二百五”=250的情况,还要检索下“百”位后是否还有“零”。

下面给出详细代码以供参考:

#define MAX 32

//先定义支持的中文符号:(单位数值由小到大排列,方便判断单位和数值大小)

char _NUMBER[59]="零一壹二贰三叁四肆五伍六陆七柒八捌九玖十拾廿百佰千仟万兆亿";

//递归辅助函数,

double _Num(double *num,char *wei,char len)//参数分别对应按字符识别好的数字,位,位数

{

double i, a, tmp;//临时数字

char w;//用来作位数指针

char c;//临时指针

char x;//临时指针

w = len - 1;

//下面检测从右到左,单位大小是否由小变大,如“五千万五千”的单位顺序就不是

while(w>0)

{

if(*(wei+w-1) <= *(wei+w)) //检测到左边单位≤右边单位

{

c = w;//记录右边单位在wei中的位置

w--;

//下面检索到左边单位比右边单位大为止

while(*(wei+w-1)<=*(wei+c) && w)

w--;

//中间c-w个单位进行递归整合成一个数值,这个数值属于c记录的单位

*(num+w) = _Num(num+w,wei+w,c-w) + *(num+c);

len = len - c + w;//单位数减少,有c-w个单位整合成一个数值了

//下面要将原来c记录的右边的单位及其数值进行左移

for(x=w+1;x<len;x++) //移动数值

*(num+x) = *(num+x+c-w);

for(x=w;x<len;x++)//移动位

*(wei+x) = *(wei+x+c-w);

}

w--;

}

//经过上面处理之后,单位排列的顺序从左到右将是由大到小的,我们就可以放心处理了

a = 0;//临时计算用数

c = 0;

while(c<len)//计算

{

tmp = *(num+c);//计算出的单位数值

switch(*(wei+c))//识别单位序号

{

case 10: i = 10;break;//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值