2016-09-17 3 views
-7

を見つけてください。ここに私のコードです:あなたのコードのロジックに誤りがない再帰階乗を見つけるためのコードが機能しません。誰かがエラー

import java.util.*; 
import java.lang.*; 

class Main 
{ 

static String fib(int f) 
{ 
    if(f!=1) 
    return ""+(f*(Integer.parseInt(fib(f-1)))); 
    else 
    return "1"; 
} 

public static void main(String[] args) throws java.lang.Exception 
{ 

    Scanner sc= new Scanner(System.in); 
    int f= sc.nextInt(); 
    int a[]=new int[f]; 
    int i; 
     for(i=0;i<f;i++) 
     a[i]=sc.nextInt(); 

    for(i=0;i<f;i++) 
    System.out.println(fib(a[i])); 
} 

} 
+0

正確には動作しません。階乗は非常に大きくなり、整数範囲を非常に簡単に超えている可能性があることに注意してください。代わりにダブルスを使用してください。また、あなたのコードは非常に遅く実行されるかもしれません。そしてなぜあなたは弦を返すのですか?そのまま番号を返してください! –

+0

あなたは達成しようとしている数字の大きさは?大量のための階乗を生成しながら、実装のストレージとロジックについてのすべてです –

+0

私は50のような大きな数値のための正しい出力を得ていません。それは小さな数字のためにうまくいきます。 factorialsが非常に大きく、出力がintまたはlongの範囲を超えてしまう可能性があるため、Stringを返します。 – Reconnect

答えて

-2

を使って階乗見つけるために、より多数のために働いていません

が。 (25を超える数値の階乗よりも短い範囲)を使用するため、出力に誤りがあります。代わりに、long、またはより好ましくはBigIntegerを使用します。

注:あなたが持っているにこのタイプを使用するBigIntegerクラスが含まれていjava.mathパッケージをインポートします。

static BigInteger fib(BigInteger f) { 
    if (!f.equals(BigInteger.ONE)) 
     return f.multiply(fib(f.subtract(BigInteger.ONE))); 
    else 
     return BigInteger.ONE; 
} 

public static void main(String[] args) throws java.lang.Exception { 

    Scanner sc = new Scanner(System.in); 
    int f = sc.nextInt(); 
    int a[] = new int[f]; 
    int i; 
    for (i = 0; i < f; i++) 
     a[i] = sc.nextInt(); 

    for (i = 0; i < f; i++) 
     System.out.println(fib(new BigInteger(String.valueOf(a[i])))); 
    } 
} 
+1

ありがとうございました。あなたが私が言及したコードのエラーを見つけるのを助けてください。 – Reconnect

+0

コードにエラーはありません。大数の階乗を計算し、それを 'int primitive size'と比較すれば' int'プリミティブの 'int primitive size'より大きい数に収まることが分かります。 'intの範囲は-2,147,483,648〜2,147,483,647'です。 –

+0

@Rishaldevsingh素敵な答えです。ちょうど編集を追加しました。 – progyammer

0

整数型(2147483647)の範囲の問題です。あなたはこの

import java.util.*; 

class Main 
{ 
    static String fib(long f) 
    { 
     if(f!=1) 
      return ""+(f*(Long.parseLong(fib(f-1)))); 
     else 
      return "1"; 
    } 
    public static void main(String[] args) throws java.lang.Exception 
    { 
     Scanner sc = new Scanner(System.in); 
     int f = sc.nextInt(); 
     long a[] = new long[f]; 
     int i; 
     for(i = 0; i<f; i++) 
      a[i] = sc.nextLong(); 
     for(i = 0; i<f; i++) 
      System.out.println(fib(a[i])); 
    } 
} 

のように長い(範囲9223372036854775807)とint型を交換した場合、プログラムはすでに21の下にあるすべてのものを計算することができます!しかし、doubleを使用すると、doubleは1.7976931348623157E308の範囲を持つため、より高い数値で動作するはずです。二倍の場合、最大作業階乗計算は170です。

PS:私はドイツ語ですので、英語が間違っています。申し訳ありません。

関連する問題