数字转换人民币大写形式:
银行、单位和个人填写的各种票据和结算凭证需要将数字金额写成人民币大写形式,它的规则主要有以下几条:
1、数字和单位使用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样,不能使用其他汉字;
2、中文大写金额数字到"元"为止的,在"元"之后、应写"整"字;在"角"之后,可以不写"整"字;大写金额数字有"分"的,"分"后面不写"整"字;
3、数字中间有0的,要用汉字零,当数字中间有多个0时,人民币大写形式按口语习惯只保留一个零,如数字30001对应转换结果为“叁万零壹元整”
输入
输入一个数字(长度不超过10位,可能包含2位小数)。
输出
对应人民币大写形式。
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
int main() {
char *arr[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
double digital;
int tmp;
bool flag, flag2;
while(EOF != scanf("%lf", &digital)) {
printf("人民币");
flag = false;
flag2 = false;
tmp = (int)digital;
if(tmp >= 100000000) {
tmp /= 100000000;
if(tmp >= 10) {
printf("%s拾", arr[tmp/10]);
}
printf("%s亿", arr[tmp%10]);
flag = true;
}
tmp = (int)digital % 100000000;
if(tmp >= 10000) {
tmp /= 10000;
if(tmp >= 1000) {
printf("%s仟", arr[tmp/1000]);
tmp %= 1000;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp >= 100) {
if(flag2) {
printf("零");
flag2 = false;
}
printf("%s佰", arr[tmp/100]);
tmp %= 100;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp >= 10) {
if(flag2) {
printf("零");
flag2 = false;
}
printf("%s拾", arr[tmp/10]);
tmp %= 10;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp > 0) {
if(flag2) {
printf("零");
flag2 = false;
}
printf("%s", arr[tmp]);
}
printf("万");
flag = true;
}
tmp = (int)digital % 10000;
if(tmp >= 1000) {
printf("%s仟", arr[tmp/1000]);
tmp %= 1000;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp >= 100) {
if(flag2) {
printf("零");
flag2 = false;
}
printf("%s佰", arr[tmp/100]);
tmp %= 100;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp >= 10) {
if(flag2) {
printf("零");
flag2 = false;
}
if(!flag && (tmp/10 == 1))
printf("拾");
else
printf("%s拾", arr[tmp/10]);
tmp %= 10;
flag = true;
} else {
if(flag) {
flag2 = true;
}
}
if(tmp > 0) {
if(flag2) {
printf("零");
flag2 = false;
}
printf("%s", arr[tmp]);
flag = true;
}
if(flag)
printf("元");
double inta = 100 * digital;
//printf("%lf, %d ", inta, (int)digital*100);
tmp = inta - (int)digital * 100;
//printf("%lf, %d ", inta, tmp);
//printf("%lf ", fabs(inta - (int)digital * 100 - tmp));
if(fabs(inta - (int)digital * 100 - tmp)>0.01) {
//printf("%d ", tmp);
tmp += 1;
//printf("%d ", tmp);
}
if(tmp >= 1) {
if(tmp >= 10) {
printf("%s角", arr[tmp/10]);
} else {
printf("零");
}
if(tmp % 10 > 0)
printf("%s分\n", arr[tmp%10]);
else
printf("\n");
} else {
printf("整\n");
}
}
return 0;
}
环境ubuntu下必须用fabs
很烦人的一题,之前的结果由于浮点数的原因,结果总是差0.01