过年了大家都在抢红包作为一个程序猿却想的是红包的算法。。。!
先说说思想 ,根据输入的钱数和分的份数 ,比如100分钱 分10份 产生9个随机数 分10堆 ,
随机数上线时总钱数最小是1 ,钱按照分来算。
下面的自己琢磨出来的关于红包算法的代码:
package com.java.test;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class wechatmoney {
static int totalmoney; // 总钱数 单位是分
static int sum; // 总份数
static int count = 0; // 测试
private static Scanner scan;
public static void main(String[] args) {
scan = new Scanner(System.in);
System.out.println("请输入总金额:");
totalmoney = scan.nextInt();
System.out.println("请输入份数:");
sum = scan.nextInt();
/* 计算钱数的和 */
List<Integer> list = weMoney();
for (Integer s : list) {
if (s == 1) {
System.err.println("出现一分钱");
}
count += s;
}
if (count == totalmoney) {
System.out.println("输出的结果数:" + list.size() + ":::" + list
+ "输出时总金额是" + count);
for (int i = 0; i < list.size(); i++) {
System.out.println("第" + (i + 1) + "份----"
+ MyFormat(list.get(i)) + "元");
}
} else {
System.err.println("计算错误");
System.exit(0);
}
}
/**
* 格式化金额
*/
private static String MyFormat(double d) {
/* 分转换为元 */
d = d * 0.01;
DecimalFormat myformat = new DecimalFormat();
myformat.applyPattern("##,##0.00");
return myformat.format(d);
}
/**
* 红包的计算
*
* @return
*/
private static List<Integer> weMoney() {
List<Integer> set = new ArrayList<Integer>();
do {
int x;
Random rand = new Random();
x = rand.nextInt(totalmoney);
if (x != 0 && !set.contains(x)) {
set.add(x);
}
} while (set.size() < (sum - 1));
/* 排序 */
Collections.sort(set);
List<Integer> list = new ArrayList<Integer>();
/* 计算出每一份钱并存入集合 */
for (int i = 0; i < set.size() - 1; i++) {
list.add(set.get(i + 1) - set.get(i));
}
list.add(set.get(0));// 加入第一份钱
list.add(totalmoney - set.get(set.size() - 1)); // 最后一份钱
return list;
}
}
不足之处请留言!
祝大家新年快乐!