币值转换 Java版

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

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

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

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

Read Me 用前必读
给出的代码是为了方便大家阅读和测试而设计的,提交PTA平台时请将第75行打印语句注释掉!



下面给的代码是我读大一的时候写的,现在看看,一坨狗屎……真不知道当时谁给的勇气……

我刷算法时,偶遇此题,想起来了写这篇博客的那个晚上,于是把代码进行了优化,请同学们

移步到这里



代码思路与解读:

代码的执行过程如下:接收用户数据并生成数组,从最高位起每4位分为一组分别创建数组1、2、3并赋值。再依次调用read()函数并各产生一串字符串,判断第二级数组是否需“读‘万’”后再将字符串依次连接,修正完成后即可得到。

点睛0:在小学四年级中“读数”中会将一串数字每四位划为一级,从低到高分别为“个位级”、“万位级”、“亿位级”,每一级的读数规则与“个位级”一致,只需在其后加上“级数”。如:112004300 读作“一亿一千二百四千三百”。

本算法在一定程度上降低了程序的耦合性,可移植性较其他同学的算法相对高一些,同时由于时间紧迫,部分细节可能做的还不是特别合适,希望各位同学能指出错误与不足。Thanks~

拆分
拆分
拆分
拆分
传递
传递
传递
传递
组合
修正
原始数据
数组1
数组2
数组3
数组4
read()函数
reslut

代码1:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int yuanshi = sc.nextInt();
		char[] cha = (yuanshi+"").toCharArray();
		int[] num = new int[9];// 存放输入的数字
		int count = 8;
		for (int i = cha.length - 1; i > -1; i--) { // 把输入的数字装进num数组
			num[count] = cha[i] - '0';
			count--;
		}

		String sanji = "";
		String erji = "";
		String yiji = "";

		// 第一级处理
		int[] s1 = new int[4];
		int s1count = 5;
		for (int i = 0; i < s1.length; i++) {
			s1[i] = num[s1count];
			s1count++;
		}
		String temps1 = read(s1);
		if (!temps1.equals("0")) {
			yiji = temps1;
		}

		// 第二级处理
		int[] s2 = new int[4];
		int s2count = 1;
		for (int i = 0; i < s2.length; i++) {
			s2[i] = num[s2count];
			s2count++;
		}
		String temps2 = read(s2);
		
		if (!temps2.equals("零")) {
			erji = temps2 + "万";
//			if(yuanshi > 99999 && num[4] == 0 && num [5] != 0) { //为了解决 “第一级满但是还需要读零”的情况,如:2205678
//				erji = temps2 + "万零";
//			}else {
//				erji = temps2 + "万";
//			}
			
		}

		// 三级处理
		if (num[0] != 0) {
			sanji = num[0] + "亿";
		}

		String reslut = sanji + erji + yiji;
		
		//修正操作

		if (reslut.charAt(0) == '零') { // 为了解决read读零的局部性而生成的代码

			reslut = reslut.substring(1, reslut.length());

		}
		if(reslut.equals("")) {
			reslut = "零";
		}else {
			if (reslut.charAt(reslut.length() - 1) == '零') {//去除后零

				reslut = reslut.substring(0, reslut.length() - 1);
			}
		}
			
		System.out.println(reslut);
		
		
		//下面是为了PTA判题程序而做的一些转换
		
		
		String reslut2 = reslut.replaceAll("零", "a").replaceAll("1", "b").replaceAll("2", "c")
		.replaceAll("3", "d").replaceAll("4", "e").replaceAll("5", "f").replaceAll("6", "g")
		.replaceAll("7", "h").replaceAll("8", "i").replaceAll("9", "j").replaceAll("十", "S")
		.replaceAll("百", "B").replaceAll("千", "Q").replaceAll("万", "W").replaceAll("亿", "Y");
		
		System.out.println(reslut2);

		// 下面是局部测试代码块

		// int[] arr = { 0, 1, 0, 3 };
		// String str = read(arr);
		// System.out.println(str);
		// if (str.charAt(0) == '零') { //为了解决read读零的局部性而生成的代码
		// System.out.println(str.substring(1, str.length()));
		//
		// } else {
		// System.out.println(str);
		// }
	}

	public static String read(int[] arr) {
		String qian = "";
		String bai = "";
		String shi = "";
		String ge = "";
		// if(arr[0] != 0 && arr[1] == 0 && arr[2] == 0 && arr[3] == 0) {
		// //整十
		// return qian+"千";
		// }else if(arr[0] = 0 && arr[1] == 0 && arr[2] == 0 && arr[3] == 0){
		//
		// }
		boolean flag = true;// 读零
		if (arr[0] != 0) {
			
			if(arr[1] == 0 && arr[2] != 0) {
				qian = arr[0] + "千零";
			}else if(arr[1] == 0 && arr[3] != 0){
				qian = arr[0] + "千零";
			}else {
				qian = arr[0] + "千";
			}
		} else {
			qian = "零";// 在局部看这行代码是错的,但是为了整体读零这是必须的。需要调用者执行修正操作。
		}
		if (arr[1] != 0) {
			if(arr[2] == 0 && arr[3] != 0) {
				bai = arr[1] + "百零";
			}else {
				bai = arr[1] + "百";
			}
			
		} else if (flag && arr[2] != 0) {
			bai = "";// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
			flag = false;
		}
		if (arr[2] != 0) {
			if (arr[0] == 0 && arr[1] == 0 && arr[2] == 1) {
				shi = "十";
			} else {
				shi = arr[2] + "十";
			}

		} else if (flag && arr[3] != 0 &&  arr[1] == 0 ) {
			shi = "";//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			flag = false;
		}
		if (arr[3] != 0) {
			ge = arr[3] + "";
		}

		String reslut = qian + bai + shi + ge;

		if (reslut.equals("")) { // 为了防止空指针异常
			return "0";
		} else {
			return reslut;
		}

	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值