微信红包的算法

过年了大家都在抢红包作为一个程序猿却想的是红包的算法。。。!

先说说思想 ,根据输入的钱数和分的份数  ,比如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;
}
}



不足之处请留言!

祝大家新年快乐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值