人民币金额大写

Q:

在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印程序。
本题的任务是:从键盘输入一个十亿以内的正整数(int类型),把它转换为人民币金额大写(不考虑用户输入错误的情况)。
比如,用户输入:35201,程序输出:叁万伍仟贰佰零壹
用户输入:30201,程序输出:叁万零贰佰零壹
用户输入:30001,程序输出:叁万零壹
用户输入:31000,程序输出:叁万壹仟
用户输入:120023201,程序输出:壹亿贰仟零贰万叁仟贰佰零壹
用户输入:120020001,程序输出:壹亿贰仟零贰万零壹
用户输入:100000001,程序输出:壹亿零壹
可以看到,在万后满千位,则不加零,否则要补零,但不要出现类似“零零”的情况。
在亿后满千万位,则不加零,否则要补零,但整个“万档”没有数字时,“万”字省去。


A:

>>判断不难,直接暴破,就是中文的赋值和输出费了点劲

>>初始化时用char[2]和char[3]会报错,必须要char[4],赋值用strncpy(str1, str2, 2)却只用了2,现在也没搞清楚


#include "stdio.h"
#include "windows.h"

int main (void)
{
	int i, n, digit, flag;
	char big[2][4]={"万","亿"}, sma[4][4]={"仟","0","拾","佰"},deci[10][4]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	//零、壹、贰、叁、肆、伍、陆、柒、捌、玖 拾、佰、仟、万、亿
	char output[40][4], origin[11]="0";
	while(scanf("%s",origin)){
		n=flag=0;
		int len=strlen(origin);
		for(i=0; i<len; i++){
			digit=(i+1)%4;
			if(digit==1){
				if(origin[len-1-i]-'0'==0 && origin[len-2-i]-'0'==0 && origin[len-3-i]-'0'==0 && origin[len-4-i]-'0'==0){
					i+=3;
					continue;
				}
				else{
					if(i/4 >= 1){
						strncpy(output[n],big[(i/4)-1],2);
						output[n][2]='\0';
						n++;
					}
				}
				if(origin[len-1-i]-'0'==0){
					flag=1;
					continue;
				}
				else{
					strncpy(output[n],deci[origin[len-1-i]-'0'],2);
					output[n][2]='\0';
					n++;
					flag=0;
				}
			}
			else{
				if(origin[len-1-i]-'0'==0){
					if(!flag){
						strncpy(output[n],deci[0],2);
						output[n][2]='\0';
						n++;
						flag=1;
					}
					else
						continue;
				}
				else{
					strncpy(output[n],sma[digit],2);
					output[n][2]='\0';
					n++;
					strncpy(output[n],deci[origin[len-1-i]-'0'],2);
					output[n][2]='\0';
					n++;
					flag=0;
				}
			}
				
		}
		for(i=n-1; i>=0; i--)
			printf("%s",output[i]);
		puts("");
	}
	system("pause");
	return (0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值