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);
Listarr = 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())));
}
Listl1 = new ArrayList();// 接收第一组数据
Listl2 = 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;jif(!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
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<