# include & ltstdio.h & gt
# include & ltstring.h & gt
# include & ltstdlib.h & gt
/*十进制转换大写程序1.0
* ljhhh0123@yahoo.com.cn 2013 . 5 . 12
* http://zh.wikipedia.org/wiki/%E5%85%86
*输入的双精度值在小数点前13位和小数点后2位以内。
*绝对不可能使用浮点来处理精确的银行货币。
* */
char *大榭[]= {
“零”、“一”、“二”、“三”、“四”、“五”、“陆”、“七”、“八”、“九”
};
char* Name[]= {
//小数点前16位数。
“钱”、“白”、“时”、“万”、“钱”、“白”、“时”、“易”,
“钱”、“白”、“时”、“万”、“钱”、“白”、“时”、“元”,
”、“角度”、“分”
};
//第1第1是十进制的和与点,第2个是终止符' \0 '。
char buf[16+1+2+1];
int main() {
双d;静态int t = 0;int m;
int num
scanf("%lf ",& ampd);
printf(" double precision double value可以表示为:");
sprintf(buf," %19.2lf ",d);//以四位为一段放入缓冲区,必须与缓冲区大小相匹配。
如果(23 & ltstrlen(buf)| | d & gt;999999999999999.99 | | d & lt=0.0) {
Printf("超出本程序范围,程序退出");
返回0;
}
fputs(buf,stdout);
fputs("\n ",stdout);
Fputs ("in words:",stdout);
for(num = 0;buf[num]!='\0';num+=4) {
int I;
char last
if(buf[num]== ' . ')破;
if(buf[num]= = ' 0 ' & amp;& ampbuf[num+1]= = ' 0 ' & amp;& ampbuf[num+2]= = ' 0 ' & amp;& ampbuf[num+3]=='0'){
if(t==0){
If(strcmp(Name[num+3],"万亿")= ||| strcmp (name [num+3],"十亿")= ||| strcmp (name [num+3]," circle") ==0 ){
fputs(Name[num+i],stdout);
t = 1;
继续;
}
}
If (buf [num+4] = ' . '){fputs ("circle ",stdout);打破;}
继续;
}
//大整数后跟一串0。
m = num
while(buf[m]!='.'){
if(buf[m]!='0 ')中断;
m++;
}
if(buf[m]== ' . '){
Fputs ("circle ",stdout);
打破;
}
//一次取四位数,判断0的位置,删除多余的0。符合人们平时的发音。
for(I = 0;我& lt4;i++) {
if(buf[num+i]== ' ')继续;
if(buf[num+i]=='0') {
last =“0”;//记住前导0。
If(i==3) {// 0结尾,比如4000,不需要输出0,但是如果是一万位,就输出一万。
fputs(Name[num+i],stdout);
打破;
}
继续;
}
if(i==3) {
If(last=='0') {//输出前导零,只输入一。
fputs(DaXie[last-'0'],stdout);
}
fputs(DaXie[buf[num+i]-'0'],stdout);
fputs(Name[num+i],stdout);
打破;
}
If(last=='0') {//输出前导零,只输入一。
fputs(DaXie[last-'0'],stdout);
}
last = buf[num+I];
fputs(DaXie[buf[num+i]-'0'],stdout);
fputs(Name[num+i],stdout);
}
}
//输出两位小数。
for(num++;buf[num]!='\0';num++) {
if(buf[num]=='0 ')继续;
fputs(DaXie[buf[num]-'0'],stdout);
fputs(Name[num],stdout);
}
Fputs ("integer \n ",stdout);
返回0;
}