算法思想:从低位到高位,每8位一分割,该组的数读法与前后都相对独立。
然后就是分析怎么来转换这个亿以内的数。
某位上如果不是0,则转换为该数对应的大写,加上该位对应的单位。如果是0,则前后连续的0都转换为零。
注意0如果出现在最后几个,比如1000,后面的0就不转换
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <list>
#include <vector>
#include <string>
using namespace std;
char dw[8][5] = {"千","百","十","万","千","百","十",""};
char num[9][5] = {"壹","贰","叁","肆","伍","陆","柒","仈","汣"};
//处理1亿以内
//保证str<=8
bool solve_yi(char *str ,bool flag)
{
int len = strlen(str);
int i = 8-len;
int j;
int last_0 = len-1;
bool before = false;
while(last_0>=0 && str[last_0] == '0') last_0--;
//printf("%d\n",last_0);
for(j=0 ; j<len ; j++,i++)
{
if(str[j] == '0')
{
if(i==3 && before) printf("万");
if(flag == false && j<last_0)
{
printf("零");
flag = true;
}
}
else
{
before = true;
flag = false;
printf("%s%s",num[str[j]-'1'],dw[i]);
}
}
return flag;
}
int main()
{
char str[100];
char buff[10];
char *temp = str;
gets(str);
bool flag = true;
char *dot = strstr(str,".");
if(dot!=NULL)
{
*dot = '\0';
dot++;
}
int len = strlen(str);
int n = len/8;
int i;
if(len%8 !=0)
{
strncpy(buff,temp,len%8);
buff[len%8] = '\0';
flag = solve_yi(buff,flag);
if(n > 0)
printf("亿");
else
printf("元");
temp = str+len%8;
}
buff[8]='\0';
for(i=0 ; i<n ; i++)
{
strncpy(buff,temp,8);
temp = temp+8;
flag = solve_yi(buff,flag);
if(i<(n-1))
printf("亿");
else printf("元");
}
if(dot!=NULL)
{
if((*dot) != '0')
printf("%s角",num[(*dot) - '1']);
dot++;
if((*dot) != '0' && (*dot)!='\0')
printf("%s分",num[(*dot) - '1']);
}
//solve_yi(buff,true);
printf("\n");
return 0;
}