1

正しく印刷されない理由がわからないようです。

public class test3 {
  public static void main(String[] args) {
    double[] gens = {100, 200.1, 9.3, 10};
    double d0 = 0;
    double d1 = 0;
    double d2 = 0;
    double d3 = 0;
    double d4 = 0;
    double d5 = 0;
    double d6 = 0;
    double d7 = 0;
    double d8 = 0;
    double d9 = 0;
    for (int i = 0; i < gens.length; i++) {
      double percs = gens[i];
      while (percs < -9 || 9 < percs) percs /= 10;
      percs = Math.abs(percs);
      if (percs == 0) {
        d0 += 1;
      }
      else if (percs == 1) {
        d1 += 1;
      }
      else if (percs == 2) {
        d2 += 1;
      }
      else if (percs == 3) {
        d3 += 1;
      }
      else if (percs == 4) {
        d4 += 1;
      }
      else if (percs == 5) {
        d5 += 1;
      }
      else if (percs == 6) {
        d6 += 1;
      }
      else if (percs == 7) {
        d7 += 1;
      }
      else if (percs == 8) {
        d8 += 1;
      }
      else if (percs == 9) {
        d9 += 1;
      }
    }
    double[] pack = {
       d0 /= gens.length,
       d1 /= gens.length,
       d2 /= gens.length,
       d3 /= gens.length,
       d4 /= gens.length,
       d5 /= gens.length,
       d6 /= gens.length,
       d7 /= gens.length,
       d8 /= gens.length,
       d9 /= gens.length
    };
    System.out.println(pack[0]);
    System.out.println(pack[1]);
    System.out.println(pack[2]);
    System.out.println(pack[3]);
    System.out.println(pack[4]);
    System.out.println(pack[5]);
    System.out.println(pack[6]);
    System.out.println(pack[7]);
    System.out.println(pack[8]);
    System.out.println(pack[9]);
  }
}

私はそれがかなり反復的であることを知っています、しかしそれは私が今のところそれを扱っている方法です。

とにかく、基本的には、gens配列内のこれらの4つの数字を取得し、それらを各数字の最初の桁(つまり、それぞれ1、2、9、および1)に切り取り、0〜9の各桁が表示される回数をカウントする必要があります。したがって、「1」は0.5(50%)、2は.25(25%)、9は.25(25%)になり、0〜9の1桁おきに0が返されます。 「1」ですが、1つおきに0であり、間違いを見つけることができませんでした。入力する数値(ハードコード)によって結果は異なりますが、ほとんどの場合間違っています。

何か案は?

ありがとうございました!

4

2 に答える 2

5

変化する

double percs = gens[i];

int percs = (int)gens[i];

ダブルのままにしておくと、whileループ

while (percs < -9 || 9 < percs) percs /= 10;

整数除算ではなく通常の除算を実行するため、最初の桁を除くすべての桁が適切に切り捨てられません。whileループの後に印刷すると、これを確認できます。percs


また、これははるかに簡単に実行できることも指摘したいと思います。例えば:

double[] gens = {100, 200.1, 9.3, 10};

int[] count = new int[10];

for (double d : gens)
    count[("" + Math.abs(d)).charAt(0) - '0']++;

for (int n : count)
    System.out.println((double)n / gens.length);

同じことをします。

于 2012-10-24T21:20:43.217 に答える
1

各段階で印刷するpercsと、次のようになります。

1.0
2.001
0.93
1.0

したがって、==は機能しません。これは、整数ではなく倍精度浮動小数点数を除算しているためです。代わりに以下を使用できます:

int percs = (int) gens[i];

これにより、必要な整数値が得られます。

于 2012-10-24T21:24:23.630 に答える