求java程序:输入n个正整数,分成两组求和,求两列数字组合使这两组的和最接近平均数

2025-03-12 19:54:54
推荐回答(2个)
回答1:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
 * 自己想了个算法,不一定正确
 * 算法过程,将一组数字从小到大排序,然后求这组数字的和/2,用这个求出的值去减去最大数,
 * 如果结果>=0,则放入第一组数字,然后用减的结果继续减第二大数,如果<0则去减第三个数,以此类推
 * 直到每个数都检查一遍
 * 这样第一组数字中的所有数相加能保证<=平均数,并且能最大范围内的接近平均数,
 * 同时没有加入第一组集合的数就是第二组的数字了.
 *
 */
public class NumberGroup {
 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
  List arr = new ArrayList();
  System.out.println("请输入一组数字:按q停止输入:");
  String s = "";
  while(true){
   s = scan.next();
   if("q".equals(s)) break;
   try{
    Double.parseDouble(s);
   }catch(Exception ex){
    System.out.println("请输入正确的数字!");
    continue;
   }
   arr.add(Double.parseDouble(s));
   System.out.println(String.format("你当前输入了%s,当前的数字集合为:%s", s,Arrays.toString(arr.toArray())));
   
  }
  
  
  List l1 = new ArrayList();// 接收第一组数据
  List l2 = new ArrayList();// 接收第二组数据
  sort(arr.toArray());// 先排序
  final double average = middle(arr.toArray());// 求中间值
  int i = arr.size()-1;
  double temp=average;
  l1 = subtractor(arr.toArray(),temp,i);
  
  
  for(int j = 0;j   if(!l1.contains(arr.get(j)))
   l2.add(arr.get(j));
  }
  System.out.println("平均数为:"+average);
  System.out.println(Arrays.toString(l1.toArray())+",总和为:"+sum(l1.toArray(),0));
  System.out.println(Arrays.toString(l2.toArray())+",总和为:"+sum(l2.toArray(),0));
 }
 /**
  * 先按照顺序从小到大排序
  * 
  * @param arr
  * @return
  */
 public static Object[] sort(Object[] arr) {
  Arrays.sort(arr);
  return arr;
 }
 /**
  * 求中间值
  * 
  * @param arr
  * @return
  */
 public static double middle(Object[] arr) {
  return sum(arr,0) / 2;
 }
 
 public static double sum(Object[] arr,int i){
  if(i == arr.length) return 0;
  return (double)arr[i]+sum(arr,++i);
 }
 
 /**
  * 用平均数依次减去数组中的最大数,如果结果>0,则加入第一组数据,如果小于0,则减去第二大数,依次类推,直到所有数都检查完为止
  * @param arr
  * @param temp
  * @param i
  * @return
  */
 public static List subtractor(Object[] arr,double temp,int i){
  List l = new ArrayList();
  if(i==-1) return l;
  if(temp - Double.parseDouble(arr[i].toString()) >= 0){
   temp = temp - Double.parseDouble(arr[i].toString());
   l.add(arr[i]);
   l.addAll(subtractor(arr,temp,--i));
  }else{
   
   l.addAll(subtractor(arr,temp,--i));
  }
  return l;
 }
}

运行结果:

请输入一组数字:按q停止输入:
1
你当前输入了1,当前的数字集合为:[1.0]
2
你当前输入了2,当前的数字集合为:[1.0, 2.0]
3
你当前输入了3,当前的数字集合为:[1.0, 2.0, 3.0]
4
你当前输入了4,当前的数字集合为:[1.0, 2.0, 3.0, 4.0]
5q
请输入正确的数字!
q
平均数为:5.0
[4.0, 1.0],总和为:5.0
[2.0, 3.0],总和为:5.0

回答2:

import java.math.*;public class T2{ public static void main(String[] args) { int[] a = {34,3,99,82,62,20,57,12,48}; long p = (1L<>=1; } System.out.println( "=\t" + sum ); }}本程序只支持最多64个整数,如果数更多,可采用BitSet来控制每个数的用与弃