2

私はプログラミングに非常に慣れていませんが、プログラマーとしてのスキルの向上に取り組んでいます。最近、私は、与えられた数の何倍が異なる数字で構成されているかを判断することに挑戦しました。ほとんどが機能するようになりましたが、入力の倍数であるすべての数値にコードを適用する必要があります。私がこれまでに取り組んできたコードは次のとおりです。

Integer numberA = 432143;
Integer numberB = numberA;
Integer[] digitArray = new Integer[numberA.toString().length()];
int index;
for (index = 0; index < digitArray.length; index++) {
    digitArray[index] = (numberA % 10);
numberA /= 10;
}
int repeats = 0;
for (int i = 0; i < digitArray.length; i++) {
    for (int j = 0; j < digitArray.length; j++) {
    if ((i != j) && (digitArray[i]==digitArray[j])) repeats = repeats + 1;
    }
}
if (repeats == 0) {
  System.out.println(numberB);
}

これにより、番号が個別の数字で構成されているかどうかが判別され、構成されている場合は印刷されます。私は残りのコードを機能させるためにかなりの時間を費やしました、そしてこれは私が思いついたものです:

Integer number = 1953824;
Integer numberA = number;
Integer numberB = numberA;
for (Integer numberC = number; numberC.toString().length() < 11; 
            numberC = numberC + number) {
    Integer[] digitArray = new Integer[numberA.toString().length()];
    int index;
    for (index = 0; index < digitArray.length; index++) {
        digitArray[index] = (numberA % 10);
        numberA /= 10;
    }
    int repeats = 0;
    for (int i = 0; i < digitArray.length; i++) {
        for (int j = 0; j < digitArray.length; j++) {
            if ((i != j) && (digitArray[i]==digitArray[j])) repeats = repeats + 1;
        }
    }
    if (repeats == 0) {
        System.out.println(numberB); 
    }
}

理由はわかりませんが、数字が異なる場合は何回も印刷し、そうでない場合は空白のままにします。なぜこれが起こっているのか、あるいはそれを修正するために私が何をする必要があるのか​​を誰かに教えてもらえれば、それは素晴らしいことです。覚えておいてください、私はプログラミングに非常に慣れていないので、あなたが使用する用語について、まったく普通ではないことについて簡単に説明してください。私は学びたいと思っていますが、現在はほとんど知りません。お時間をいただき、ありがとうございました。皆様のご協力に心より感謝申し上げます。

4

2 に答える 2

1

forループの直前にnumberAの値をnumberB(numberの値)に割り当てます。その後、numberBが変更されたり、新しい値に割り当てられたりすることはないため、forループを通過するたびに、numberBの値(この場合は常に1953824)を出力するだけです。

コードを少しクリーンアップしながら、希望する結果を達成するために行うことができるいくつかの修正があります。最初に、printステートメントを変更して正しい番号を出力します。

System.out.println(numberC);

numberCはforループによって更新される変数であるため、繰り返し桁がない場合は、これを条件付きで出力する必要があります。numberBをnumberCに置き換えたため、numberBは不要になりました。そのため、宣言を削除できます。

次の問題は、デジタル配列を定義するときです。numberAではなくnumberCの長さを使用する必要があります。また、forループ内で、numberAにnumberCの値を割り当てる必要があります。そうしないと、最終的には0だけがdigitArrayに格納されます。全体として、次のようになります。

    Integer number = 1953824;
    Integer numberA = number;

    for (Integer numberC = number; numberC.toString().length() < 11; 
                    numberC = numberC + number) {

        Integer[] digitArray = new Integer[numberC.toString().length()];
        numberA = numberC;
        int index;
        for (index = 0; index < digitArray.length; index++) {
            digitArray[index] = (numberA % 10);
            numberA /= 10;
        }
        int repeats = 0;
        for (int i = 0; i < digitArray.length; i++) {
            for (int j = 0; j < digitArray.length; j++) {
                if ((i != j) && (digitArray[i] == digitArray[j]))
                    repeats = repeats + 1;
            }
        }
        if (repeats == 0) {
            System.out.println(numberC);
        }
    }

これにより、目的の結果が得られるはずです。それは私のマシンで動作するようです:)

必要に応じて、Jeffreyの提案を採用し、整数をプリミティブintに変更して、ボクシングのオーバーヘッドを回避できます。ただし、toString()メソッドを使用するには、それでもIntegerクラスを使用する必要がありますが、Integerを使用してそれを実現できます。valueOf():

Integer.valueOf(numberC).toString()
于 2013-02-08T03:19:20.780 に答える
0

ですから、私が正しく理解していれば、あなたはあなたの番号の中に特定の倍数が存在するかどうかを調べようとしています。常に10で割る代わりに、モジュラス記号を使用します。条件文に埋め込むこともできます。

例えば:

if(numberOne % 2 == 0)

次に、numberOneを2で割った余りはゼロであり、したがって2の倍数であることがわかります。

于 2013-02-08T03:19:44.603 に答える