package edu.mama.ls15.homework;import java.io.FileReader;import java.io.IOException;import java.io.Reader;import java.math.BigDecimal;import java.math.RoundingMode;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Homework { /** * 第一题:count个人抢总额为amount的拼手气红包 * * 要求: * 1、通过程序限制,每人最多能抢200元 * 2、通过程序限制,最多允许10人参与抢红包 * 3、红包金额单位为元,保留2位小数 * 4、打印每个人红包的金额 * 5、打印手气最佳者的序号和金额 * * @param amount 拼手气红包总金额 * @param count 抢红包的人数 */ public static void redEnvelope(BigDecimal amount, int count) { //TODO 这里写下你的代码 final BigDecimal MIN = new BigDecimal("0.01"); final BigDecimal MAX = new BigDecimal("200"); if (count <= 0 || count > 10) { throw new IllegalArgumentException("只允许1-10人参与抢红包"); } if (amount == null || amount.compareTo(MIN.multiply(new BigDecimal(count))) < 0 || amount.compareTo(MAX.multiply(new BigDecimal(count))) > 0) { throw new IllegalArgumentException("每人最少能抢0.01元,最多200元"); } List<BigDecimal> amounts = new ArrayList<>(); for (int i = count; i > 1; i--) { //计算经过本次抢红包后最多允许剩下的钱数 BigDecimal maxRemind = new BigDecimal(i - 1).multiply(MAX); //计算经过本次抢红包后最少允许剩下的钱数 BigDecimal minRemind = new BigDecimal(i - 1).multiply(MIN); //本次抢红包金额的最小值 BigDecimal minAmount = MIN.max(amount.subtract(maxRemind)); BigDecimal maxAmount = MAX.min(amount.subtract(minRemind)); BigDecimal curAmount = maxAmount.subtract(minAmount) .multiply(BigDecimal.valueOf(Math.random())) .add(minAmount) .setScale(2, RoundingMode.HALF_UP); amounts.add(curAmount); amount = amount.subtract(curAmount); } //最后一个人抢红包不需要随机,剩下多少全是他的 amounts.add(amount); BigDecimal maxAmount = BigDecimal.ZERO; int maxIndex = 0; for (int i = 0; i < amounts.size(); i++) { BigDecimal amt = amounts.get(i); System.out.printf("第%d个人抢到:%s\n", i, amt); if (maxAmount.compareTo(amt) < 0) { maxAmount = amt; maxIndex = i; } } System.out.printf("第%d号为手气最佳,抢得%s\n", maxIndex, maxAmount); } /** * 第二题:断点续读 * 要求:上次已经从filePath种读取了一部分内容lastRead,但并没有全部读取完成,继续读取文件中的剩余内容并返回 * 提示:查看API * * @param filePath 文件路径 * @param lastRead 上次读取到的内容 */ public static String continueRead(String filePath, String lastRead) { //TODO 这里写下你的代码 String str = ""; //使用try(resource)用法,自动关闭流 try (Reader input = new FileReader(filePath, Charset.forName("UTF-8"))) { //跳过上次已读取的内容,从未读取的位置开始读取 input.skip(lastRead.length()); //定义数据缓存去 int bufferSize = 100; char[] chars = new char[bufferSize]; int count = input.read(chars); //每次读入100个字符,循环读入 while (count > 0) { char[] contents = Arrays.copyOf(chars, count); //将本次读到的内容拼接到字符串例 str += new String(contents); //本次读入的数据处理完成,尝试再次读入100字符,返回实际读入字符数 count = input.read(chars); } } catch (IOException e) { e.printStackTrace(); } return str; } public static void main(String[] args) { //第一题 //TODO 这里写下你的代码 try { redEnvelope(new BigDecimal("1"), 10); } catch (Exception e) { System.out.println(e.getMessage()); } //第二题 String other = continueRead("LS15/res/晖哥语录.txt", "人性无所谓善与恶"); System.out.println(other); }}
