zoukankan      html  css  js  c++  java
  • 币值转换

    题目:

    输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

    输入格式:

    输入在一行中给出一个不超过9位的非负整数。

    输出格式:

    在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

    输入样例1:

    813227345
    

    输出样例1:

    iYbQdBcScWhQdBeSf
    

    输入样例2:

    6900
    

    输出样例2:

    gQjB
    

    这道币值转换,是一道十分有意思的题目,我会以分段的形式讲解这道题目。

    讲解:

    代码开始前先讲一个东西: 1e5 。这个其实是科学计数法,相当于 1 * 10^5 ,这是因为我不喜欢长串的 0 所以以科学记数法的形式表现出来。

    现在开始讲解代码:

    首先我使用全局变量,将题目需要的符号改变以数组的形式写出来,并且声明并初始化一个 Billion 的变量,用于之后的最高位判断。

    char theValue[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
    char theUnit[5] = { 'S','B','Q','W','Y' };
    int Billion = 100000000;
    

    如果在写代码期对于这些繁杂烟花的字母没有任何好感的话,也可以将其换成我们中文的数字及单位,等到跑出我们想要的结果后再改回来。

    char theValue[10] = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
    char theUnit[5] = { '十','百','千','万','亿' };
    

    随后我们输入我们需要进行转换的数据 num

    int num;
    scanf("%d", &num);
    

    之后进行 非0 判断,由此代码可以简写成一下形式:

    if (num == 0)			// 如果输入的数据为 0,那么我们直接输出 0 就行了
    	printf("零");
    else
    	其余情况转换操作
    

    现在剩下的所有情况就只分为三种:

    X >= 1,0000,0000;
    1,0000,0000 >= X >= 1,0000;
    1,0000 >= X.

    我们知道数组的编号是从零开始,而我们的转换数组正好与编号一致,也就是说我们呢可以直接以 array[num] 的形式输出转换的数字。

    printf("%c", theValue[temp]);
    
    char theValue[10] = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
    

    现在我们需要的只是单位的判断。

    判断单位的时候有一个极为麻烦的事。我们不知道什么时候输出 亿 什么时候输出万,什么时候不输出。那么这个时候我们就可以判断我们输出数据的最高位。

    while (num)									// 判断数字的最高位
    {
    	if (num / Billion > 0)
    		break;
    	else
    		Billion /= 10;
    }
    

    采用以下的方式,最高位不足亿位,则 Billion 除以10,那么该数据的最高位就是千万位,而对应的 Billion 是1e7那么就不会输出 theUnit[4] ,也就是亿。

    同样的方式,如果是在千万位和千位,即 Billion1e71e3 时输出千。

    else 
    {
    	printf("%c", theValue[temp]);
    	if (Billion == 1e5 || Billion == 1e1)
    		printf("%c", theUnit[0]);
    	else if (Billion == 1e6 || Billion == 1e2)
    		printf("%c", theUnit[1]);
    	else if (Billion == 1e7 || Billion == 1e3)
    		printf("%c", theUnit[2]);
    }
    

    最后剩下一个棘手的问题那就是数据中间出现零的问题。此时的情况是该位上只需输出零,并不用管它对应的单位是什么。那我们则可以使用 if - else 将其分开判断,只要该位上的数据为 0,则只需输出零即可,否则按照普遍规律输出。

    最后提醒一下,中间我为了容易理解,用的是中文的数字。大家在提交代码的时候记得改回题目需要的转换量

    流程图:

    源代码:

    #include <stdio.h>
    
    char theValue[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
    char theUnit[5] = { 'S','B','Q','W','Y' };
    int Billion = 100000000;
    
    int main()
    {
    	int num;
    	scanf("%d", &num);
    
    	if (num == 0)
    		printf("a");
    	else
    	{
    		while (num)									// 判断数字的最高位
    		{
    			if (num / Billion > 0)
    				break;
    			else
    				Billion /= 10;
    		}
    
    		while (num)
    		{
    			int temp = num / Billion;
    
    			if (temp == 0)
    			{
    				if ((num - temp * Billion) / (Billion / 10) != 0)
    					printf("a");
    			}
    			else 
    			{
    				printf("%c", theValue[temp]);
    				if (Billion == 1e5 || Billion == 1e1)
    					printf("%c", theUnit[0]);
    				else if (Billion == 1e6 || Billion == 1e2)
    					printf("%c", theUnit[1]);
    				else if (Billion == 1e7 || Billion == 1e3)
    					printf("%c", theUnit[2]);
    			}
    			if (Billion == 1e4)
    				printf("%c", theUnit[3]);
    			else if (Billion == 1e8)
    				printf("%c", theUnit[4]);
    
    			num -= temp * Billion;
    			Billion /= 10;
    		}
    	}
    
    	return 0;
    }
  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/zsbhs/p/10360215.html
Copyright © 2011-2022 走看看