问题:模拟微信发红包,定义红包金额和个数,随机生成相应个数的红包,每个红包的金额大小随机,但总金额与红包金额一致。
问题分析:
生活常识:微信红包最小金额是一分,也就是0.01元
根据生活常识可以将这个问题分三种情况讨论如下:
情况1,用户定义的红包总金额和红包总个数恰好使每个人分到0.01元,此时红包总金额除以红包总个数等于0.01;
情况2,红包总金额和红包总个数的关系可以使每个人分到的钱大于等于红包最小金额0.01(总有人抢到的红包钱是大于0.01的,要不然就与情况1重复了),此时红包总金额除以红包总个数大于0.01;
情况3,红包总金额和红包总个数在每个人分到0.01的情况下依然不成立,此时提示用户输入增大红包金额还是减少红包总个数的选项,此时红包总金额除以红包总个数小于0.01。
代码运行截图:
情况1:
情况2:
情况3:
具体实现代码:
package 实验.作业4;
import java.util.Random;
import java.util.Scanner;
import java.text.DecimalFormat;
public class red_bags {
public static void main(String[] args) {
System.out.println("** 微信抢红包 **");
Scanner sc = new Scanner(System.in);
System.out.print("请输入红包总金额(元):");
double red_bags_total = sc.nextDouble();
System.out.print("请输入红包个数(个 ):");
int red_bags_count = sc.nextInt();
double min = 0.01; //红包最小金额
Random c = new Random(); //随机数
int x = 1;
while (x == 1) {
if (red_bags_total / red_bags_count == min) {
for (int i = 1; i <= red_bags_count; i++) {
System.out.println("第" + i + "个人抢到红包:" + 0.01 + "元");
x = 0;
}
System.out.println("程序结束,感谢您的使用!");
} else if (red_bags_total / red_bags_count > 0.01) {
for (int i = 1; i < red_bags_count; i++) {
//在保证后red_bags_count - i个人都得到最小红包金额0.01元的时候,前面i个人总共分的钱的总数
double max = red_bags_total - (red_bags_count - i) * min;
double bound = max - min;
double safe = (double) c.nextInt((int) (bound * 100)) / 100;//nextInt(int n)返回0~n之间的随机值,n取不到
double money = safe + min;//以防出现0值
red_bags_total = red_bags_total - money;//发出一个红包后剩下的总金额
System.out.println("第" + i + "个人抢到红包" + String.format("%.2f", money) + "元");
}
System.out.println("第" + red_bags_count + "个人抢到红包" + String.format("%.2f", red_bags_total) + "元");
x = 0;
System.out.println("程序结束,感谢您的使用!");
} else {
// while(red_bags_total / red_bags_count < min)
System.out.println("每个人收到红包的最小金额是0.01元哦,增加红包总金额或者减少红包总个数:");
System.out.print("增加红包总金额1 or 减少红包总个数0:");
int temp = sc.nextInt();
if (temp == 1) {
System.out.print("增加多少钱呢?");
double temp_money = sc.nextDouble();
red_bags_total += temp_money;
} else if (temp == 0) {
System.out.print("请重新输入红包总个数:");
red_bags_count = sc.nextInt();
} else {
System.out.println("你的选择有误,发红包失败,退出程序!");
x = 0;
}
}
}
}
}