过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,让每个人写一个纸条上来,谁写的数目与奖金最接近,就算中,这笔奖金就归谁,如果多人猜中,则平分。编写程序,算算都有哪些人得到奖金?多少?
这个能用数组写一个程序给我吗 想看看成品 自己搞不明白。。
import java.util.Collections;
import java.util.Comparator;
import java.util.Arrays;
class Q707984 {
public static void main(String[] args) {
int award = 100;
String[] people = { "a", "b", "c", "d", "e", "f", "g", "h" };
Integer[] guess = { 75, 70, 80, 120, 100, 110, 100, 45 };
Integer[] ordered = new Integer[people.length];
for (int i = 0; i < ordered.length; i++) ordered[i] = i;
Arrays.sort(ordered, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
int x = guess[a] - award > 0 ? guess[a] - award : award - guess[a];
int y = guess[b] - award > 0 ? guess[b] - award : award - guess[b];
return x - y;
}
});
int maxp = 0;
int i = 0;
while (guess[ordered[i++]] == award) maxp++;
if (maxp <= 1)
System.out.println(people[ordered[0]] + "一人得奖" + award + "元。");
else
{
for (i = 0; i < maxp; i++)
System.out.print(people[ordered[i]] + " ");
System.out.println("共同得奖" + award / (float)(maxp) + "元。");
}
}
}
如果多人一样,但是都有误差,也平分,那么
int i = 0;
while (guess[ordered[i++]] == award) maxp++;
修改为
int i = 1;
while (guess[ordered[i++]] == guess[0]) maxp++;
如果问题得到解决,请点我回答左上角的采纳,谢谢
可以先遍历找到猜的最近距离是多少,再遍历一遍找到等于最近距离的人,把他们的数据存起来,最后进行操作就简单了
import java.util.Scanner;
class people{
String name;
double guess;
}
public class bonus {
public static void main(String []args) {
Scanner Input=new Scanner(System.in);
System.out.print("输入村民人数和奖金:");
double sum; //奖金
double min; //最近距离
int n; //村民人数
int m=0; //中奖人数
n=Input.nextInt();
min=sum=Input.nextDouble();
people my[]=new people[n];
for (int i=0;i<n;i++) {
my[i]=new people();
my[i].name=Input.next();
my[i].guess=Input.nextDouble();
min=Math.abs(my[i].guess-sum)<min?Math.abs(my[i].guess-sum):min;
}
System.out.println("以下村民中奖");
for(int i=0;i<n;i++) {
if(Math.abs(my[i].guess-sum)==min) {
m++;
System.out.println(my[i].name);
}
}
System.out.println("奖金为"+sum/m);
}
}
其实思路很简单呀 用数组的话 把所有猜的数目都存放在数组里面 然后排个序 再用预定的奖金数字去遍历一遍数组 插入排序一下 他附近的不就是嘛。
/**
*
* @Description:过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,
* 让每个人写一个纸条上来,谁写的数目与奖金最接近,
* 就算中,这笔奖金就归谁,如果多人猜中,则平分。
* 编写程序,算算都有哪些人得到奖金?多少?
* @param bonus 奖金
* @param obj key:人, value:猜测金额
* @return Map key:人 value:活动奖金金额
* @throws
*/
public static Map bonus(Double bonus, Map obj){
Map map = new HashMap<>();
if (obj.isEmpty()) {
return map;
}
Set keySet = new HashSet<>();
Double tmpValue = Double.MAX_VALUE;
for (String key: obj.keySet()) {
if (Math.abs(obj.get(key) - bonus) < tmpValue) {
tmpValue = Math.abs(obj.get(key) - bonus);
keySet.clear();
keySet.add(key);
} else if (Math.abs(obj.get(key) - bonus) == tmpValue){
keySet.add(key);
}
}
BigDecimal b1 = new BigDecimal(bonus);
BigDecimal b2 = new BigDecimal(keySet.size());
BigDecimal divide = b1.divide(b2);
for (String key : keySet) {
map.put(key, divide.doubleValue());
}
return map;
}
/**
*
* @Description:过年了,村里要庆祝。村长说,村里有一笔钱作为奖金,
* 让每个人写一个纸条上来,谁写的数目与奖金最接近,
* 就算中,这笔奖金就归谁,如果多人猜中,则平分。
* 编写程序,算算都有哪些人得到奖金?多少?
* @param bonus 奖金
* @param person 人
* @param conjecture 猜测金额
* @return Map<String,Double> key:人 value:活动奖金金额
* @throws
*/
public static Map<String, Double> bonus(Double bonus, String[] person, Double[] conjecture){
Map<String, Double> map = new HashMap<>();
if (person == null || conjecture == null || person.length == 0
|| conjecture.length == 0 || person.length != conjecture.length) {
return map;
}
Set<String> keySet = new HashSet<>();
Double tmpValue = Double.MAX_VALUE;
for (int i = 0; i < conjecture.length; i++) {
Double value = conjecture[i];
String key = person[i];
if (Math.abs(value - bonus) < tmpValue) {
tmpValue = Math.abs(value - bonus);
keySet.clear();
keySet.add(key);
} else if (Math.abs(value - bonus) == tmpValue){
keySet.add(key);
}
}
BigDecimal b1 = new BigDecimal(bonus);
BigDecimal b2 = new BigDecimal(keySet.size());
BigDecimal divide = b1.divide(b2);
for (String key : keySet) {
map.put(key, divide.doubleValue());
}
return map;
}
import java.util.Scanner;
class People {
String name;//人名
double guess;//猜测的数字
}
class BaseInfo{
double bonus;//奖金数量
int peoples;//村民人数
}
public class Bonus {
private static Scanner input=new Scanner(System.in);
public static void main(String []args) {
BaseInfo baseInfo=buildBaseInfo(input);//活动基本信息
People peoples[]=buildPeoples(baseInfo);//村民填写的纸条信息
getGuessingNum(peoples,baseInfo);//获取获奖名单
}
/**
* 获取猜中人数并打印
* @return
*/
private static void getGuessingNum(People[] peoples,BaseInfo baseInfo){
double min=getMinNumber(peoples,baseInfo.bonus);//最接近奖金的数字
int guessingNum=0;
System.out.println("以下村民中奖");
for(int i=0;i<baseInfo.peoples;i++) {
if(Math.abs(peoples[i].guess-baseInfo.bonus)==min) {
guessingNum++;
System.out.println(peoples[i].name);
}
}
System.out.println("奖金为"+baseInfo.bonus/guessingNum);
}
/**
* 获取最接近奖金的数字
* @return
*/
private static double getMinNumber(People[] peoples,double min){
for (int i=0;i<peoples.length;i++) {
min=Math.abs(peoples[i].guess-min)<min?Math.abs(peoples[i].guess-min):min;
}
return min;
}
//整理抽奖活动的基本信息
private static BaseInfo buildBaseInfo(Scanner Input){
System.out.print("输入村民人数和奖金(空格隔开):");
BaseInfo baseInfo=new BaseInfo();
baseInfo.peoples= Input.nextInt();//村民人数
baseInfo.bonus=Input.nextDouble();//奖金
return baseInfo;
}
/**
* 收集村民填写的纸条
* @param baseInfo
* @return
*/
private static People[] buildPeoples(BaseInfo baseInfo){
People peoples[]=new People[baseInfo.peoples];
for (int i=0;i<baseInfo.peoples;i++) {
System.out.print("输入村民人姓名和猜测的数字(空格隔开):");
peoples[i]=new People();
peoples[i].name=input.next();
peoples[i].guess=input.nextDouble();
}
return peoples;
}
}