acm java题_ACM练习题-java编写

本文介绍了两个ACM编程题目,包括括号配对问题的Java实现,通过递归检查括号是否匹配;另一个是人民币转换问题,将数字金额转换为中文大写,包括整数和小数部分的处理。代码中提供了详细的解决方案。
摘要由CSDN通过智能技术生成

1. 括号配对问题:

package com.util;

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 括号配对问题: 现在,有一行括号序列,请你检查这行括号是否配对。

*

* 输入: 第一行输入一个数N(0i; j--) {

char ele_op = source.charAt(j);

if ((ele == char1 && ele_op == char2) || (ele == char3 && ele_op == char4)) {

String subStr = source.substring(i + 1, j);

if ((subStr == null || subStr.length() == 0) || isMatchKuohao(subStr)) {

flag = true;

i = j + 1;

break;

}

}

}

if (!flag) {

return false;

}

}

return true;

}

}

2.  人民币转换问题

校验结果正确与否,参照在线转换器: http://link.fobshanghai.com/rmb.htm

package com.util;

import java.util.HashMap;

import java.util.Map;

public class TestAmount {

public static final String zero = "零";

public static final String[] nums = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

public static final String[] unit_one = new String[] { "", "拾", "佰", "仟" };

public static final String[] unit_two = new String[] { "", "万", "亿" };

public static void main(String[] args) {

String amount = convertAmount("90001010436.10");

System.out.println(amount);

}

public static String convertAmount(String source) {

StringBuilder sb = new StringBuilder();

sb.append("人民币");

if (source.indexOf(".") > 0) {

String[] strArr = source.split("\\.");

if (strArr.length == 2) {

long number1 = Long.parseLong(strArr[0]);

int number2 = Integer.parseInt(strArr[1]);

sb.append(convertIntAmount(number1));

sb.append("元");

sb.append(convertFloatAmount(number2));

}

} else {

long number = Long.parseLong(source);

sb.append(convertIntAmount(number));

sb.append("元整");

}

return sb.toString();

}

public static StringBuilder convertFloatAmount(int number) {

StringBuilder sb = new StringBuilder();

int jiao = number / 10;

int fen = number % 10;

if (jiao > 0) {

sb.append(nums[jiao]);

sb.append("角");

}

if (fen > 0) {

sb.append(nums[fen]);

sb.append("分");

}

return sb;

}

public static String convertIntAmount(long number) {

if((number + "").length() > 11){

throw new IllegalArgumentException("金额过大,应小于1000亿元!");

}

StringBuilder sb = null;

int pointer = 0;

boolean isLastZero = false;

do {

int result = (int) (number % 10000);

number = number / 10000;

MapresultMap = calRemainder(result, (number > 0), isLastZero);

StringBuilder remainder = (StringBuilder) resultMap.get("remainderStr");

isLastZero = (resultMap.get("isFirstZero") != null) && (Boolean) resultMap.get("isFirstZero");

if (remainder.length() != 0) {

if (!(remainder.length() == 1 && zero.equals(remainder.toString()))) {

remainder.append(unit_two[pointer]);

}

} else {

if (!isLastZero) {

remainder.append(zero);

}

}

if (sb != null) {

remainder.append(sb);

}

sb = remainder;

pointer++;

} while (number > 0);

return sb.toString();

}

public static MapcalRemainder(int number, boolean isContinue, boolean isLastRemainderZero) {

StringBuilder sb = new StringBuilder();

int beginVal = 1000;

int pointer = 3;

int flag;

boolean isLastZero = false;

MapresultMap = new HashMap();

do {

flag = number / beginVal;

// 只有前面还有更大的单位、并且不连续补零、并且上次的余数首位不为零的情况下才补上零

if (flag != 0) {

sb.append(nums[flag]);

sb.append(unit_one[pointer]);

isLastZero = false;

} else {

if (isLastRemainderZero && number == 0) {

isLastZero = true;

}

if (!isLastZero && isContinue) {

sb.append(zero);

isLastZero = true;

}

if (pointer == 3) {

resultMap.put("isFirstZero", isLastZero);

}

}

number = number % beginVal;

pointer--;

beginVal /= 10;

} while (number > 0);

resultMap.put("remainderStr", sb);

return resultMap;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值