java 模拟QQ拼手气红包
来源:互联网 发布:mac 删除程序 编辑:程序博客网 时间:2024/04/28 22:57
package com.test;
import java.util.Random;
import java.util.Scanner;
public class RedPackage {
/**
* 模拟QQ拼手气红包
* @author zm
* @param args
*/
public static void main(String[] args) {
int num = 0;// 红包的个数
double cash = 0;// 总钱数
int pin = 0;// 判断是否拼手气的临时变量
int MaxNo = 0;// 记录最大值的位置
int MinNo = 0;// 记录最小值的位置
while (true)
{
System.out.println("1.请问要发多少个红包?");
Scanner number = new Scanner(System.in);
num = number.nextInt();// 读取用户输入,并存入num变量
if (num == 0)// 如果用户输入了0
{
System.out.println("输入错误,请输入大于0的整数!" + "\n" + "请重新输入!" + "\n");// 返回警告
// System.exit(0);//结束程序
}
else
break;
}
System.out.println();
double[] a = new double[num];// 定义一个double型的有num个元素的数组
while (true)
{
System.out.println("2.请问要发多少钱?");
Scanner coin = new Scanner(System.in);
cash = coin.nextDouble();// 读取用户输入,并存入cash变量
if ((100 * cash) % 1 != 0)// 如果用户输入了三位或更多位的小数
{
System.out
.println("输入错误,请输入最多保留两位的小数" + "\n" + "请重新输入!" + "\n");// 返回警告
// System.exit(0);//结束程序
}
else if ((cash / num) < 0.01)// 如果每个红包平均分到的金额小于0.01元
{
System.out.println("红包数不能少于0.1");
// 返回警告
// System.exit(0);//结束程序
} else if ((cash / num) > 200)// 如果每个红包平均分到的金额大于200元
{
System.out.println("金额错误,单个红包金额不可大于200元,请调整金额和红包数");
// 返回警告
// System.exit(0);//结束程序
}
else
break;
}
System.out.println();
while (true)
{
System.out.println("是否设定为拼手气红包?(请输“1”或“2”,1代表是,2代表否)");
Scanner pi = new Scanner(System.in);
pin = Integer.parseInt(pi.nextLine());// 读取用户输入,并存入pin变量
if (pin == 0)
System.out.println("选择错误,请选择1或2!" + "\n" + "请重新输入!" + "\n");// 返回警
else if (pin > 2) {
System.out.println("选择错误,请选择1或2!" + "\n" + "请重新输入!" + "\n");// 返回警
}
else
break;
}
if (pin == 1)
{
System.out.println("\n正在生成总金额为" + cash + "元的" + num + "个拼手气红包");
pinshouqiArray(a, cash);
// printArray(a);
double sum2 = Math.round(sum(a) * 100);
// System.out.println(sum2/100);
int cash1 = (int) (cash * 100);
int sum1 = (int) (sum2);
int resi = cash1 - sum1;
for (int i = 0; i < resi; i++)
{
a[(int) (Math.floor(a.length * Math.random()))] += 0.01;
sishewuru(a);
}
printArray(a);
double sum3 = Math.round(sum(a) * 100);
System.out.println("共发出:" + sum3 / 100 + "元");
MaxNo = Max(a);
MinNo = Min(a, cash);
if (MaxNo == MinNo)
System.out.println("大家拿的都一样╮(╯▽╰)╭");
else
{
System.out.println("第" + MaxNo + "位童鞋手气最佳!");// 显示手气最佳的人
System.out.println("第" + MinNo + "位童鞋请再接再厉!");// 显示手气最差的人
}
}
else if (pin == 2)
{
System.out.println("\n正在生成总金额为" + cash + "元的" + num + "个普通红包");
if (cash * 100 / num != 1)
{
System.out.println("金额不能平均分配给每个红包,程序结束");
System.exit(0);
}
else
{
a = putongArray(a, cash);// 普通红包,存入数组
printArray(a);// 打印每个红包到屏幕
double sum3 = Math.round(sum(a) * 100);
System.out.println("总金额:" + sum3 / 100);
}
}
}
public static double[] initial(double[] a)
{
for (int i = 0; i <= a.length - 1; i++)
a[i] = 0.01;
return a;
}
public static void printArray(double[] a)// 方法:打印数组到屏幕
{
System.out.print("结果:" + "\n");
for (int i = 0; i <= a.length - 1; i++)
System.out.println("第" + (i + 1) + "个红包里面有" + a[i] + "元");
}
public static double[] baoliu(double[] a)// 保留两位小数,不要四舍五入
{
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
{
b = a[i];
c = (Math.floor(100 * b));// 向下取整
c /= 100;
a[i] = c;
}
return a;
}
public static double[] arraygenerate(double[] a)// 产生随机数组
{
for (int i = 0; i <= a.length - 1; i++)
{
a[i] = Math.random();
a = baoliu(a);
}
return a;
}
public static double[] pinshouqiArray(double[] a, double cash)
{
arraygenerate(a);// 随机给数组中的每个元素分配一个0~1之间的小数
double sum = 0;// 定义变量
sum = sum(a);
for (int i = 0; i <= a.length - 1; i++)
{
a[i] *= ((cash - a.length * 0.01) / sum);
a[i] += 0.01;
}
baoliu(a);
return a;// 返回数组
}
public static double[] sishewuru(double[] a)// 保留两位小数,四舍五入
{
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
{
b = a[i];
c = Math.round(100 * b);// 向下取整
c /= 100;
a[i] = c;
}
return a;
}
public static double sum(double[] a)
{
double sum = 0;
for (int i = 0; i <= a.length - 1; i++)
sum += a[i];// 算出所有元素的总和
return sum;
}
public static double[] putongArray(double[] a, double cash)// 普通红包
{
for (int i = 0; i <= a.length - 1; i++)
{
double temp = 0;
temp = Math.floor(cash * 10);// 向下取整,为避免系统自动四舍五入导致超额的情况
temp /= 10;
a[i] = temp / a.length;// 取平均值
}
return a;// 返回数组
}
public static int Max(double[] a)// 求最大值的序号
{
double max = 0;
int recmax = 0;
for (int i = 0; i <= a.length - 1; i++)
{
if (a[i] > max)
{
max = a[i];
recmax = i + 1;
}
}
return recmax;// 返回最大值的序号
}
public static int Min(double[] a, double cash)// 求最小值的序号
{
double min = cash + 1;
int recmin = 0;
for (int i = 0; i <= a.length - 1; i++)
{
if (a[i] < min)
{
min = a[i];
recmin = i + 1;
}
}
return recmin;// 返回最小值的序号
}
import java.util.Random;
import java.util.Scanner;
public class RedPackage {
/**
* 模拟QQ拼手气红包
* @author zm
* @param args
*/
public static void main(String[] args) {
int num = 0;// 红包的个数
double cash = 0;// 总钱数
int pin = 0;// 判断是否拼手气的临时变量
int MaxNo = 0;// 记录最大值的位置
int MinNo = 0;// 记录最小值的位置
while (true)
{
System.out.println("1.请问要发多少个红包?");
Scanner number = new Scanner(System.in);
num = number.nextInt();// 读取用户输入,并存入num变量
if (num == 0)// 如果用户输入了0
{
System.out.println("输入错误,请输入大于0的整数!" + "\n" + "请重新输入!" + "\n");// 返回警告
// System.exit(0);//结束程序
}
else
break;
}
System.out.println();
double[] a = new double[num];// 定义一个double型的有num个元素的数组
while (true)
{
System.out.println("2.请问要发多少钱?");
Scanner coin = new Scanner(System.in);
cash = coin.nextDouble();// 读取用户输入,并存入cash变量
if ((100 * cash) % 1 != 0)// 如果用户输入了三位或更多位的小数
{
System.out
.println("输入错误,请输入最多保留两位的小数" + "\n" + "请重新输入!" + "\n");// 返回警告
// System.exit(0);//结束程序
}
else if ((cash / num) < 0.01)// 如果每个红包平均分到的金额小于0.01元
{
System.out.println("红包数不能少于0.1");
// 返回警告
// System.exit(0);//结束程序
} else if ((cash / num) > 200)// 如果每个红包平均分到的金额大于200元
{
System.out.println("金额错误,单个红包金额不可大于200元,请调整金额和红包数");
// 返回警告
// System.exit(0);//结束程序
}
else
break;
}
System.out.println();
while (true)
{
System.out.println("是否设定为拼手气红包?(请输“1”或“2”,1代表是,2代表否)");
Scanner pi = new Scanner(System.in);
pin = Integer.parseInt(pi.nextLine());// 读取用户输入,并存入pin变量
if (pin == 0)
System.out.println("选择错误,请选择1或2!" + "\n" + "请重新输入!" + "\n");// 返回警
else if (pin > 2) {
System.out.println("选择错误,请选择1或2!" + "\n" + "请重新输入!" + "\n");// 返回警
}
else
break;
}
if (pin == 1)
{
System.out.println("\n正在生成总金额为" + cash + "元的" + num + "个拼手气红包");
pinshouqiArray(a, cash);
// printArray(a);
double sum2 = Math.round(sum(a) * 100);
// System.out.println(sum2/100);
int cash1 = (int) (cash * 100);
int sum1 = (int) (sum2);
int resi = cash1 - sum1;
for (int i = 0; i < resi; i++)
{
a[(int) (Math.floor(a.length * Math.random()))] += 0.01;
sishewuru(a);
}
printArray(a);
double sum3 = Math.round(sum(a) * 100);
System.out.println("共发出:" + sum3 / 100 + "元");
MaxNo = Max(a);
MinNo = Min(a, cash);
if (MaxNo == MinNo)
System.out.println("大家拿的都一样╮(╯▽╰)╭");
else
{
System.out.println("第" + MaxNo + "位童鞋手气最佳!");// 显示手气最佳的人
System.out.println("第" + MinNo + "位童鞋请再接再厉!");// 显示手气最差的人
}
}
else if (pin == 2)
{
System.out.println("\n正在生成总金额为" + cash + "元的" + num + "个普通红包");
if (cash * 100 / num != 1)
{
System.out.println("金额不能平均分配给每个红包,程序结束");
System.exit(0);
}
else
{
a = putongArray(a, cash);// 普通红包,存入数组
printArray(a);// 打印每个红包到屏幕
double sum3 = Math.round(sum(a) * 100);
System.out.println("总金额:" + sum3 / 100);
}
}
}
public static double[] initial(double[] a)
{
for (int i = 0; i <= a.length - 1; i++)
a[i] = 0.01;
return a;
}
public static void printArray(double[] a)// 方法:打印数组到屏幕
{
System.out.print("结果:" + "\n");
for (int i = 0; i <= a.length - 1; i++)
System.out.println("第" + (i + 1) + "个红包里面有" + a[i] + "元");
}
public static double[] baoliu(double[] a)// 保留两位小数,不要四舍五入
{
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
{
b = a[i];
c = (Math.floor(100 * b));// 向下取整
c /= 100;
a[i] = c;
}
return a;
}
public static double[] arraygenerate(double[] a)// 产生随机数组
{
for (int i = 0; i <= a.length - 1; i++)
{
a[i] = Math.random();
a = baoliu(a);
}
return a;
}
public static double[] pinshouqiArray(double[] a, double cash)
{
arraygenerate(a);// 随机给数组中的每个元素分配一个0~1之间的小数
double sum = 0;// 定义变量
sum = sum(a);
for (int i = 0; i <= a.length - 1; i++)
{
a[i] *= ((cash - a.length * 0.01) / sum);
a[i] += 0.01;
}
baoliu(a);
return a;// 返回数组
}
public static double[] sishewuru(double[] a)// 保留两位小数,四舍五入
{
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
{
b = a[i];
c = Math.round(100 * b);// 向下取整
c /= 100;
a[i] = c;
}
return a;
}
public static double sum(double[] a)
{
double sum = 0;
for (int i = 0; i <= a.length - 1; i++)
sum += a[i];// 算出所有元素的总和
return sum;
}
public static double[] putongArray(double[] a, double cash)// 普通红包
{
for (int i = 0; i <= a.length - 1; i++)
{
double temp = 0;
temp = Math.floor(cash * 10);// 向下取整,为避免系统自动四舍五入导致超额的情况
temp /= 10;
a[i] = temp / a.length;// 取平均值
}
return a;// 返回数组
}
public static int Max(double[] a)// 求最大值的序号
{
double max = 0;
int recmax = 0;
for (int i = 0; i <= a.length - 1; i++)
{
if (a[i] > max)
{
max = a[i];
recmax = i + 1;
}
}
return recmax;// 返回最大值的序号
}
public static int Min(double[] a, double cash)// 求最小值的序号
{
double min = cash + 1;
int recmin = 0;
for (int i = 0; i <= a.length - 1; i++)
{
if (a[i] < min)
{
min = a[i];
recmin = i + 1;
}
}
return recmin;// 返回最小值的序号
}
}
效果如下:
1.请问要发多少个红包?
6
2.请问要发多少钱?
10
是否设定为拼手气红包?(请输“1”或“2”,1代表是,2代表否)
1
正在生成总金额为10.0元的6个拼手气红包
结果:
第1个红包里面有0.34元
第2个红包里面有3.99元
第3个红包里面有1.3元
第4个红包里面有1.88元
第5个红包里面有0.4元
第6个红包里面有2.09元
共发出:10.0元
第2位童鞋手气最佳!
第1位童鞋请再接再厉!
0 0
- java 模拟QQ拼手气红包
- 自己写的模拟微信拼手气红包C++程序源文件
- 发手气红包算法
- php实现微信拼手气红包
- c语言实现手气红包算法
- Java模拟抢红包应用
- java 简单模拟抢红包
- 天猫抢红包今天手气不错两个帐号抢…
- JAVA实现 简单抢红包算法,模拟真实抢红包。
- java 简单模拟抢红包2
- 在拼多多怎样找寻红包
- qq抢红包
- QQ 微信抢红包
- QQ抢红包插件
- QQ红包随机数算法
- qq微信红包抢红包神器
- 多线程模拟抢红包
- 模拟微信红包
- 回归 - 线性回归、θ正则、伪逆
- 灰度直方图的原理和计算
- SQL注入之实践--初试小刀
- Linux 给新用户授予、设置Tomcat目录的使用权限
- C学习笔记(一) C语言和汇编语言的区别
- java 模拟QQ拼手气红包
- 关于android.view.WindowLeaked(窗体泄露)的解决方案
- [leetcode 刷题记录] 167. Two Sum II - Input array is sorted
- Codeforces Round #200 (Div. 2)
- Xcode方法提示不显示的解决方法
- bat脚本------aging state
- FPGA配置
- 优先队列-堆
- 关于win10操作系统下ISE14.7的安装