質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1300閲覧

フィボナッチ数列の X0〜X49 までを表示するプログラム

hona_tan

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/28 10:20

###実現したいこと
↓このような実行結果にしたい
イメージ説明

発生している問題・エラーメッセージ

全てが0になってしまった。

$ javac Fibonacci.java $ java Fibonacci x0 = 1 x1 = 0 x2 = 0 x3 = 0 x4 = 0 x5 = 0 x6 = 0 x7 = 0 x8 = 0 x9 = 0 x10 = 0 x11 = 0 x12 = 0 x13 = 0 x14 = 0 x15 = 0 x16 = 0 x17 = 0 x18 = 0 x19 = 0 x20 = 0 x21 = 0 x22 = 0 x23 = 0 x24 = 0 x25 = 0 x26 = 0 x27 = 0 x28 = 0 x29 = 0 x30 = 0 x31 = 0 x32 = 0 x33 = 0 x34 = 0 x35 = 0 x36 = 0 x37 = 0 x38 = 0 x39 = 0 x40 = 0 x41 = 0 x42 = 0 x43 = 0 x44 = 0 x45 = 0 x46 = 0 x47 = 0 x48 = 0 x49 = 0

該当のソースコード

public class Fibonacci { public static void main(String[] args) { int[] x = new int[50]; System.out.println("x0 = 1"); for (int i=1; i<x.length; i=i+1) { int a = (int)(Math.sqrt(1/5)); int b = 1/2 + (int)(Math.sqrt(5/4)); int c = (int)(Math.pow(b, i)); int d = 1/2 - (int)(Math.sqrt(5/4)); int e = (int)(Math.pow(d, i)); System.out.println("x" +i+ " = " +a*(c-e)); } } }

試したこと

いろいろ試したと言うと抽象的になってしまうのですが。いろいろ調べたりして実行したのですがダメでした。全くわかりません、助けてください。

補足情報(FW/ツールのバージョンなど)

PC:Mac
エディタ:Atom

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

ルートや1/2の計算をしていますが、変数はintのままで問題ないんですか?

投稿2020/07/28 10:55

Kaleidoscope

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

普通にフィボナッチ数列の定義に従って求めればいいだけでは?

Java

1x[0] = 1; 2x[1] = 1; 3for (int i = 2; i < x.length; i++) { 4 x[i] = x[i - 1] + x[i - 2]; 5 System.out.println(x[i]); 6}

投稿2020/07/28 13:10

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ポイントは次の2点です。

  • 第50項まで求めるとintでは桁あふれする
  • フィボナッチ数列を求める公式をちゃんと使う

床関数を使う公式を使いました。

Java

1static final double SQRT5 = Math.sqrt(5); 2static final double GOLDEN_RATIO = (1 + SQRT5)/2.0; 3 4static long[] fibonacci(final long limit) { 5 return LongStream.rangeClosed(1,limit+1) 6 .map(i -> (long) Math.floor(Math.pow(GOLDEN_RATIO,i)/SQRT5+0.5)) 7 .toArray(); 8}

使用例。

Java

1long[] result3 = fibonacci(49l); 2System.out.println( 3 LongStream.of(result3).mapToObj(String::valueOf).collect(Collectors.joining(", ","[","]")) 4);

投稿2020/07/28 23:43

xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int の割り算の結果は int です。小数部分は切り捨てられます。
1/2 = 0.5 -> 0
1/5 = 0.2 -> 0
5/4 = 1.25 -> 1

double の割り算の結果は小数です。
1.0/2 = 0.5

int a = (int)(Math.sqrt(1.0/5))
Math.sqrt(1.0/5) は 0.4472136... です。これを (int) でキャストすると 0。
これでは正しい結果になりません。

また、int の最大値は 2147483647 なので、
x46 = 2971215073 のような値にはなりません。
int の代わりに long を使わないとだめでしょう。

すべて double で計算して、最後に (long) でキャストすると、

Java

1public class Fibonaaci { 2 public static void main(String[] args) { 3 for (int i = 0; i < 50; i++) { 4 double a = Math.sqrt(1.0/5); 5 double b = 1.0/2 + Math.sqrt(5.0/4); 6 double c = Math.pow(b, i+1); 7 double d = 1.0/2 - Math.sqrt(5.0/4); 8 double e = Math.pow(d, i+1); 9 double x = a * (c - e); 10 System.out.println("x" + i + " = " + (long)x + "\t\t" + x); 11 } 12 } 13}

double の計算は誤差が入り結果が例えば
x8 = 34 34.00000000000001 ではなく
x8 = 33 33.99999999999999 になる可能性もあります。
今回は (long)x が切り捨てでうまく行っていますが、
(long)(x + 0.1) などとしたほうが良いかもしれません。

for文の中で、sqrt や pow を何度も計算するのは無駄なので、書き直すと、

Java

1public class Fibonacci { 2 public static void main(String[] args) { 3 double sqrt5 = Math.sqrt(5); 4 double k = 1 / sqrt5; 5 double phi = (1 + sqrt5) / 2; 6 double phi2 = 1 - phi; 7 double powPhi = 1, powPhi2 = 1; 8 9 for (int i = 0; i < 50; i++) { 10 powPhi *= phi; 11 powPhi2 *= phi2; 12 double x = k * (powPhi - powPhi2); 13 System.out.println("x" + i + " = " + (long)x + "\t\t" + x); 14 } 15 } 16}

投稿2020/07/28 23:06

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問