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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

2回答

1406閲覧

project euler #002について

engawa

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2016/03/09 10:02

project eulerの2問目に以下のようなものがありました。

フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

そして以下のコードでなんとか正解にたどり着きました。

#include <stdio.h>> int main(void){ long num[4000]; long sum = 2; num[0] = 1; num[1] = 2; for (int i=0; num[i]<=4000000; i++){ num[i+2] = num[i+1] + num[i]; if (num[i+2]%2 == 0) { sum += num[i+2]; } } printf("%ld", sum); return 0; }

質問は2つあります。

  1. はじめ配列を用意するときに目分量でやらざるをえませんでした。この場合目安はどのように決定したらよろしいですか?また、大きすぎるとエラーが出るのはメモリを無駄に使用するからですか?

  2. for構文において for (int i=0; num[i+2]<=4000000; i++){...}としたところ結果がトンチンカンになってしまいました。これはなぜでしょうか。

プログラミングを始めて1週間足らずの未熟者で、まだc言語の本をパラパラと読んだ程度なので、大変稚拙なコードですがなんとか演習量を増やそうと頑張っている状態です。どなたかご教授お願いいたします。長文失礼いたしました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

  1. プログラムを作る時に配列などの大きさが判らない場合、

一般的には「メモリの動的確保」ということを行います。
プログラムを実行した際に領域を確保したり、サイズ変更します。
具体的には、malloc()という関数を使います(他にもありますが)。

  1. 実行した時点で、num[i+2]の値が決まっていないからです。

配列num[]を初期化していないので、めちゃくちゃな値が入っています。

C

1for (int i=0; printf("[%ld]\n",num[i+2]), num[i+2]<=4000000; i++){...}

としてみればわかると思います。

補足
ちなみに、このプログラムなら配列を使わなくてもできますね。

C

1int main() 2{ 3 int a2, a1, a0; 4 long sum = 0; 5 6 a2 = 0; 7 a0 = a1 = 1; 8 while(a2 < 4000000) { 9 a2 = a1 + a0; 10 11 if(a2%2 == 0) { 12 sum += a2; 13 } 14 15 a0 = a1; 16 a1 = a2; 17 18 } 19 20 printf("sum : %ld\n", sum); 21 22 return 0; 23 24}

ご参考まで。

投稿2016/03/09 11:19

haraken

総合スコア70

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

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

engawa

2016/03/09 11:25

回答速度でベストアンサーをつけさせていただきましたが、harakenさんの回答がよりして深く掘り下げてくださったので変更させていただきました。(tkturboさん申し訳ないです...) とてもわかりやすい回答ありがとうございました。いろいろ試してみます!
guest

0

1.そもそも題意だけ考えれば配列なんていらないっす。
2つ前と1つ前のフィボナッチ数があれば次のフィボナッチ数は算出できるので保持してなきゃいけないのはその二つと合計値を計算するようの変数。
たとえば

long num0 = 1, num1 = 2, num2; long sum = 0; while (num2 < 4000000) { num2 = num0 + num1; sum += (num2 % 2 = 0) ? num2 : 0; num0 = num1; num1 = num2; }

こんなんでも計算できると思われ。

投稿2016/03/09 10:20

tkturbo

総合スコア5572

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

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

engawa

2016/03/09 10:29 編集

変数3つで値の交換をしあえばこんなシンプルに済むのですね笑 つらつらと長いコードを書いたのがお恥ずかしいです。もう少し基礎構文を勉強しなおしたいと思います。 回答ありがとうございました!
tkturbo

2016/03/09 10:31

あ、num1の初期値1だったw このソースじゃ2が足されませんな><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問