1. package edu.mama.ls15.homework;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. import java.io.Reader;
    5. import java.math.BigDecimal;
    6. import java.math.RoundingMode;
    7. import java.nio.charset.Charset;
    8. import java.util.ArrayList;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. public class Homework {
    12. /**
    13. * 第一题:count个人抢总额为amount的拼手气红包
    14. *
    15. * 要求:
    16. * 1、通过程序限制,每人最多能抢200元
    17. * 2、通过程序限制,最多允许10人参与抢红包
    18. * 3、红包金额单位为元,保留2位小数
    19. * 4、打印每个人红包的金额
    20. * 5、打印手气最佳者的序号和金额
    21. *
    22. * @param amount 拼手气红包总金额
    23. * @param count 抢红包的人数
    24. */
    25. public static void redEnvelope(BigDecimal amount, int count) {
    26. //TODO 这里写下你的代码
    27. final BigDecimal MIN = new BigDecimal("0.01");
    28. final BigDecimal MAX = new BigDecimal("200");
    29. if (count <= 0 || count > 10) {
    30. throw new IllegalArgumentException("只允许1-10人参与抢红包");
    31. }
    32. if (amount == null
    33. || amount.compareTo(MIN.multiply(new BigDecimal(count))) < 0
    34. || amount.compareTo(MAX.multiply(new BigDecimal(count))) > 0) {
    35. throw new IllegalArgumentException("每人最少能抢0.01元,最多200元");
    36. }
    37. List<BigDecimal> amounts = new ArrayList<>();
    38. for (int i = count; i > 1; i--) {
    39. //计算经过本次抢红包后最多允许剩下的钱数
    40. BigDecimal maxRemind = new BigDecimal(i - 1).multiply(MAX);
    41. //计算经过本次抢红包后最少允许剩下的钱数
    42. BigDecimal minRemind = new BigDecimal(i - 1).multiply(MIN);
    43. //本次抢红包金额的最小值
    44. BigDecimal minAmount = MIN.max(amount.subtract(maxRemind));
    45. BigDecimal maxAmount = MAX.min(amount.subtract(minRemind));
    46. BigDecimal curAmount = maxAmount.subtract(minAmount)
    47. .multiply(BigDecimal.valueOf(Math.random()))
    48. .add(minAmount)
    49. .setScale(2, RoundingMode.HALF_UP);
    50. amounts.add(curAmount);
    51. amount = amount.subtract(curAmount);
    52. }
    53. //最后一个人抢红包不需要随机,剩下多少全是他的
    54. amounts.add(amount);
    55. BigDecimal maxAmount = BigDecimal.ZERO;
    56. int maxIndex = 0;
    57. for (int i = 0; i < amounts.size(); i++) {
    58. BigDecimal amt = amounts.get(i);
    59. System.out.printf("第%d个人抢到:%s\n", i, amt);
    60. if (maxAmount.compareTo(amt) < 0) {
    61. maxAmount = amt;
    62. maxIndex = i;
    63. }
    64. }
    65. System.out.printf("第%d号为手气最佳,抢得%s\n", maxIndex, maxAmount);
    66. }
    67. /**
    68. * 第二题:断点续读
    69. * 要求:上次已经从filePath种读取了一部分内容lastRead,但并没有全部读取完成,继续读取文件中的剩余内容并返回
    70. * 提示:查看API
    71. *
    72. * @param filePath 文件路径
    73. * @param lastRead 上次读取到的内容
    74. */
    75. public static String continueRead(String filePath, String lastRead) {
    76. //TODO 这里写下你的代码
    77. String str = "";
    78. //使用try(resource)用法,自动关闭流
    79. try (Reader input = new FileReader(filePath, Charset.forName("UTF-8"))) {
    80. //跳过上次已读取的内容,从未读取的位置开始读取
    81. input.skip(lastRead.length());
    82. //定义数据缓存去
    83. int bufferSize = 100;
    84. char[] chars = new char[bufferSize];
    85. int count = input.read(chars);
    86. //每次读入100个字符,循环读入
    87. while (count > 0) {
    88. char[] contents = Arrays.copyOf(chars, count);
    89. //将本次读到的内容拼接到字符串例
    90. str += new String(contents);
    91. //本次读入的数据处理完成,尝试再次读入100字符,返回实际读入字符数
    92. count = input.read(chars);
    93. }
    94. } catch (IOException e) {
    95. e.printStackTrace();
    96. }
    97. return str;
    98. }
    99. public static void main(String[] args) {
    100. //第一题
    101. //TODO 这里写下你的代码
    102. try {
    103. redEnvelope(new BigDecimal("1"), 10);
    104. } catch (Exception e) {
    105. System.out.println(e.getMessage());
    106. }
    107. //第二题
    108. String other = continueRead("LS15/res/晖哥语录.txt", "人性无所谓善与恶");
    109. System.out.println(other);
    110. }
    111. }

    image.png