|
2010/10/15(Fri) 13:17:59 編集(投稿者)
とりあえず100になればいいのであれば最後の数字だけ調整すればいいんですかね
public static void main(String[] args) {
// 配列 int data[] = { 150, 25, 25, 14 }; int total = 0;
for (int i = 0; i < data.length; i++) { total += data[i];
}
int result[] = new int[data.length]; int total_process = 0;
for (int i = 0; i < data.length - 1; i++) { result[i] = (int)Math.round((double)data[i]/total*100); total_process+=result[i]; } result[data.length - 1] = 100 - total_process; }
次に長いですが端数の小さいものを大きいものに移動する方法で考えてみました javaは不勉強なのでコードに無駄が多少ありますがこんなのでどうでしょうか?
public static void main(String[] args) {
// 配列 int data[] = { 150, 25, 25, 14 }; int total = 0;
for (int i = 0; i < data.length; i++) { total += data[i];
}
int result[] = new int[data.length]; double result_hasu[] = new double[data.length];
for (int i = 0; i < data.length; i++) { result_hasu[i] = (double) data[i] / total * 100; result[i] = (int) result_hasu[i]; result_hasu[i] -= result[i]; }
do { int maxindex = -1; int minindex = -1; // 最大端数と最小端数のindexを算出 for (int i = 0; i < data.length; i++) { if (result_hasu[i] == 0 || result_hasu[i] == 1) { continue; } if (maxindex == -1) { maxindex = i; } if (minindex == -1) { minindex = i; } if (result_hasu[maxindex] < result_hasu[i]) { maxindex = i; } if (result_hasu[minindex] > result_hasu[i]) { minindex = i; } } if (maxindex != -1) { if (minindex != -1 && maxindex != minindex) { // 最大端数が1になるまで最小端数を移動 double add = Math.min(1 - result_hasu[maxindex], result_hasu[minindex]); result_hasu[maxindex] += add; result_hasu[minindex] -= add; } else { break; } } } while (true);
for (int i = 0; i < data.length; i++) { // 端数を結果に戻す result[i] += Math.round(result_hasu[i]); } }
|