java做運算後最接近值

請問java給一串次

像是5 13 21 30 35

我可以在這五個數字中,做加減法,從裡面找到加減法裡面最接近0的值嗎?

5 13 21 30 35

差距最接近0的是2 答案就是2

1 2 3 4 5

差距最接近0的是1 答案就是1

我應該要怎麼做比較好?

Update:

不知道要怎麼算阿

我應該是打錯了

我從打一次

假設有五個數字

要分兩堆 兩堆最接近的數

這樣子OK嗎?

Update 2:

輸入為k件物品,其價值分別為n1, n2, ..., nk,1 ≤ ni ≤ 1000,而此k個正整數間以空格隔開。

輸出所有可能分堆情形中,兩堆價值差距的最小值。

4 Answers

Rating
  • 7 years ago
    Favorite Answer

    /// pile.java

    import java.util.Arrays;

    public class pile {

    private int[] pileInt;

    private boolean[] pileTake;

    public pile (int[] s){

    pileInt = Arrays.copyOf(s, s.length);

    pileTake= new boolean[s.length];

    for(int i=pileTake.length-1; i>=0; --i) pileTake[i]=false;

    return;

    }

    public pile (int s) {

    pileInt = new int[s];

    pileTake= new boolean[s];

    for(int i=pileTake.length-1; i>=0; --i) pileTake[i]=false;

    return;

    }

    public boolean next(){

    for(int i=pileTake.length-1; i>=0; --i) {

    if (pileTake[i]){

    pileTake[i] = false;

    } else {

    pileTake[i] = true;

    return true;

    }

    }

    return false;

    }

    public int value(){

    int sum, i;

    for(sum=0, i=pileInt.length-1; 0 <= i; --i) sum += pileInt[i];

    return sum;

    }

    public int value(boolean st){

    int sum, i;

    for(sum=0, i=pileInt.length-1; 0 <= i; --i) if(st == pileTake[i]) sum += pileInt[i];

    return sum;

    }

    public int[] getList(boolean st){

    int cnt=0,

    i,j ;

    for(boolean x:pileTake) if(st == x) ++cnt;

    int[] ret = new int[cnt];

    for(j=i=0; j < cnt;++i) if(st == pileTake[i]) ret[j++] = pileInt[i];

    return ret;

    }

    }/// main.java

    public class doPile {

    public static void main(String[] args){

    int[] dat = {13, 5, 17, 10, 21, 35, 30},best1= {},best2 = {};

    int mn, tot;

    pile p = new pile(dat);

    tot = p.value();

    System.out.printf("Total value of the pile = %d, %d/%d\n",

    tot, p.value(false), p.value(true));

    for(mn = tot; 0 < mn && p.next(); ){

    int v0 = p.value(false),

    v1 = tot - v0 ,

    df = (v0>v1)?(v0-v1):(v1-v0);

    if (mn > df) {

    mn = df;

    best1 = p.getList(true);

    best2 = p.getList(false);

    }

    }

    System.out.printf("Smallest diff between the piles = %d\n", mn);

    for(int x:best1) System.out.printf("%d ", x);

    System.out.printf("and the other pile is ");

    for(int x:best2) System.out.printf("%d ", x);

    return;

    }

    }

  • ccc
    Lv 6
    7 years ago

    方法都大同小異,下個範例就是了.

    public class Test1 {

    static int [] n=new int[10]; //5個數字宣告10要素陣列

    private static int mm; //計算總和用

    private static int min=9999; //比大小用

    private static String ans=""; //結果字串用

    public static void main(String[] args) {

    n[0]=5;

    n[1]=13;

    n[2]=21;

    n[3]=30;

    n[4]=35;

    for(int i=0;i<5;i++) n[i+5]=-n[i]; //做出5個數字的負數

    //==== 以下共 5 維迴圈(5個數字)

    for (int i1=0;i1<10;i1+=5)

    for (int i2=1;i2<10;i2+=5)

    for (int i3=2;i3<10;i3+=5)

    for (int i4=3;i4<10;i4+=5)

    for (int i5=4;i5<10;i5+=5){

    mm=n[i1]+n[i2]+n[i3]+n[i4]+n[i5]; //5個數字相加(也有可能加負數)

    if (Math.abs(mm)<min){ //比絕對值大小

    min=Math.abs(mm);

    ans=min+"=("+n[i1]+")+("+n[i2]+")+("+n[i3]+")+("+n[i4]+")+("+n[i5]+")";

    }

    }

    System.out.println(ans); //印出結果

    }

    }

    Source(s): 自己
  • 7 years ago

    想要做完運算的結果最接近零的就用排序

    至於要做怎樣的運算的話,五個數的話有四個運算子,只用加減法的話那從

    0000-1111都做一次(0表示減法1表示加法)

  • 7 years ago

    是可以做到你說的那樣

    只是有點不懂你的問題

    看不懂描述

    5 13 21 30 35

    差距最接近0的是2 答案就是2

    這什麼意思啊??

    你的五個數字應該放在陣列或List裡面

    然後跑回圈去計算你要做的事

    如果 你要找最接近0的 那用排序就好啦 呵呵

Still have questions? Get your answers by asking now.