yukiyukkiのぐんにょり日記

興味の赴くままに。

目次

書庫

Blog 利用状況

自サイト

某さんのところで見かけた例題。

鳥の人のところで見かけたので、やってみるー


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

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。


Sub Main()

 Dim totalcnt As Long
 Dim n1,n2,n3 As Long
 Dim Limit As Long

 n1 = 0 : n2 = 1 : n3 = 1
 Limit = 4000000

 Do While n3 <= Limit
  If n3 mod 2 = 0 Then
   totalcnt = totalcnt + n3
  End If

  n3 = n1 + n2
  n1 = n2
  n2 = n3
 Loop

 Debug.Print "Total:" & totalcnt

End Sub

一応加算する前にtotal計算してるからループ一回余分に回るのは大丈夫なんだけど、ちょっと気持ち悪い・・・

投稿日時 : 2009年1月8日 22:26

Feedback

# re: 某さんのところで見かけた例題。 2009/01/08 22:49 m

http://d.hatena.ne.jp/torikobito/20090108

# re: 某さんのところで見かけた例題。 2009/01/10 12:54 2リットル

はじめまして、こんにちは。
あれこれやってたらこうなりました。

int calc(int limit)
{
  int now = 2;
  int prev = 0;
  if (limit < now) {
    return 0;
  }

  do {
    // 要素が偶数の部分配列だけを計算する。
    // evenHibo(n) = 4*evenHibo(n-1) + evenHibo(n-2)
    int next = 4 * now + prev;
    prev = now;
    now = next;
  } while (limit >= now);

  // Sum(n) = (evenHibo(n+1) + evenHibo(n) - 2) / 4
  return (now + prev - 2) / 4;
}

# re: 某さんのところで見かけた例題。 2009/01/13 0:05 biac

> ちょっと気持ち悪い・・・

別に実害は無さそうなので、 かまわないんじゃないでしょうか f(^^;

気になるなら、 ループの後ろでやっている変数のスライド ( n1 ← n2, n2 ← n3 ) を、 ループの前の方に持っていけば OK です。
ただしその場合は、 偶数チェック ( If n3 mod 2 = 0 Then ) の前に、 余計に変数スライドが入るわけですから、 その分、 初期値を繰り下げてやる必要があります。
n1 = 0 : n2 = 1 : n3 = 1

n1 = 0 : n2 = 0 : n3 = 1

※ C# ですけど、 私のとこにもコードを上げてみました。 f(^^;

# re: 某さんのところで見かけた例題。 2009/01/13 0:16 ゆきゆっき

>mさん
そうです、それみて書きましたー

>2リットルさん
むー、Cでしょうか?
Cはさっぱり。。><

>biacさん
なるほどです!
初期値繰り下げれば良かったんですねー。
ちょっと、思いつかなかったw

# re: 某さんのところで見かけた例題。 2009/05/05 3:06 はるにゃん

Project Euler を総て解くと面白いですよ

http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler

# YYIBkpzhGbMl 2012/01/07 7:52 http://www.luckyvitamin.com/c-448-yerba-mate

Left on my site a link to this post. I think many people will be interested in it..!

タイトル
名前
Url
コメント