【解決方法】npr の計算で何が問題になっていますか?


Java
calculate nPr n!/(n-r)!.
input :- 5 2
output :- 20

私が試したこと:

Java
public class Main{
  
  public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      int b = sc.nextInt();
      int dn = Value(n, b);
      System.out.println(dn);
   }
   
   public static int Value(int n, int r){
    // Your code here
	    int fact = n;  
            for (int i= n-1; i>1; i--)  
            {  
                fact = fact * i;  
            } 
	    
           int num = (n - r);  
           int fact2 = num;  
            for (int i = num - 1; i >= 1; i--)  
            {  
                fact2 = fact2 * i;  
            }  
           int per = fact / fact2;  

	   return per;
   }
  }

解決策 3

小さな入力値を提供することを簡単に確認できるため、実際にはコードは論理的に正しいです。
問題が発生するとき n > 12、 なぜなら 13! = 6,227,020,800 より大きい数 Java int データ型の最大値 (2,147,483,647)。
問題を改善するために、次のことを行うことができます。

  • 使用 Java long データ・タイプ。 このようにして、コードは階乗を正しく計算します n まで 20

  • (と n>k)
    n!/k! = (n * (n-1) * .. * k * (k-1) * .. 1) / (k * k-1) * .. 1) = (n * (n-1) * .. * (k+1))
    

    このように、例えば

    50! / 48! = 50 * 49 = 2450
    

    また、 スターリングの近似 – ウィキペディア[^] 入力を検証するため (つまり、 double 指定された入力が積分計算をオーバーフローする場合のデータ型推定)、

解決策 1

ググってみましたか? Java を使用して npr を計算する方法 – Google 検索[^]

最初の結果は次のとおりです。 nPr の値を計算するプログラム – GeeksforGeeks[^]

他にもたくさんあります。

解決策 2

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

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

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

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

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

C#
private int Double(int value)
   {
   return value * value;
   }

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

コメント

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