【解決方法】テスト ケースが失敗するのはなぜですか?


問題: 範囲内のアームストロング数を見つける

input:        0 160
output:       0 1 2 3 4 5 6 7 8 9 153
constraints:- 0 <= m <= n <= 105

私が試したこと:

Java
for(int i = m; i <= n; i++) {
    int temp=i;
    int ct =0;

    while (temp != 0) {
        ct = ct+1;
        temp = temp/10;
    }
        
    temp = i;
    int sum=0;
    while (temp != 0) {
        int ans = temp % 10;
        sum = sum + (int)Math.pow(ans, ct);
        temp = temp/10;
    }

    if (sum==i) {
        System.out.print(i + " ");
    }
}

解決策 2

あなたのコードは Armstrong の数値を正しく報告します (少なくとも 9926315)。
だから、私は本当にあなたの理由がわかりません 「テストケースが失敗しています」.
より良いヘルプを得るために、詳しく説明してください。

解決策 1

コンパイルしても、コードが正しいとは限りません! :笑う:
開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。

それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:

int Double(int value)
   {
   return value * value;
   }

何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!

解決策 3

テスト ケースが失敗する理由をトラブルシューティングするには、失敗している特定のテスト ケースと、そのテスト ケースで予想される出力に関する詳細情報を入手すると役立ちます。 この情報がないと、障害の原因を特定することは困難です。

一般に、コードにいくつかの印刷ステートメントを含めて、何が起こっているのかをデバッグして理解することをお勧めします。 たとえば、temp、ct、sum などの変数の中間値を出力して、テスト ケースが失敗した理由を理解するのに役立てることができます。

コードが正しく機能することを確認するために、コードにいくつかのテスト ケースを含めることもお勧めします。 これにより、エラーやバグを早期に発見し、問題の特定と修正が容易になります。

最後に、コードをダブルチェックして、コードが正しく、問題の制約と要件に従っていることを確認することをお勧めします。 この場合、解決策が指定された範囲 (0 <= m <= n <= 105) の入力値を処理できること、およびその範囲のアームストロング数を正しく識別することが重要です。 指定された範囲 (0 <= m <= n <= 105) 内のアームストロング数を正しく識別する Java の解決策を次に示します。

public void printArmstrongNumbers(int m, int n) {<br />
    for (int i = m; i <= n; i++) {<br />
        int temp = i;<br />
        int ct = 0;<br />
        while (temp != 0) {<br />
            ct++;<br />
            temp /= 10;<br />
        }<br />
<br />
        temp = i;<br />
        int sum = 0;<br />
        while (temp != 0) {<br />
            int digit = temp % 10;<br />
            sum += (int) Math.pow(digit, ct);<br />
            temp /= 10;<br />
        }<br />
<br />
        if (sum == i) {<br />
            System.out.print(i + " ");<br />
        }<br />
    }<br />
}<br />

この解決策は、最初にループを使用して入力数値 i の桁数をカウントします。 次に、桁数で累乗した桁の合計を計算し、この合計が元の数値と等しいかどうかをチェックします。 そうである場合、i はアームストロング数であり、出力に出力されます。

コメント

タイトルとURLをコピーしました