2017-03-19 21 views
1

目前我正在編寫一個程序,在Windows窗體應用程序(WPA)中找到even斐波那契數字,並帶有用戶輸入。找到所有甚至斐波納契數字的總和,用戶輸入

當我執行我的程序時,我用不同的數據來對比我的測試數據。

例如,當我輸入型100,000,我得到的輸出是5500034但它應該是60696.

我的程序的代碼如下:

 int val1 = 1; 
     int val2 = 2; 
     Int64 evenTerms = 2; 
     val2 = int.Parse(textBox3.Text); 
     while (val2 < 5000000) 
     { 
      int temp = val1; 
      val1 = val2; 
      val2 = temp + val2; 
      if (val2 % 2 == 0) 
      { 
       evenTerms += val2; 
      } 
     } 
     MessageBox.Show("" + val2); 

任何人的幫助我理清了這個問題?

謝謝。

+0

您確定要計算斐波納契數字嗎?因爲如果我沒有弄錯,你可以從你的例子中的數字1和10000開始... – MetaColon

回答

1

我建議使用發電機枚舉所有的斐波那契數:

public static IEnumerable<long> FiboGen() { 
    long left = 0; 
    long right = 1; 

    yield return left; 
    yield return right; 

    while (true) { 
    long result = left + right; 

    yield return result; 

    left = right; 
    right = result; 
    } 
} 

然後的LINQ來總結所需的值只有

int limit = int.Parse(textBox3.Text); 

// 60696 for the 1000000 limit 
// 4613732 for the 5000000 limit 
var result = FiboGen()   // take Fibonacci numbers 
    .Where(val => val % 2 == 0)  // but only even ones 
    .TakeWhile(val => val < limit) // and less than limit 
    .Sum();       // finally sum them up. 

MessageBox.Show(result.ToString()); 
0

至於我明白你的問題(這個問題不清楚),希望這個解決方案的工作:)

 int val1 = 0; 
     int val2 = 1; 
     Int64 evenTerms = 0; 
     int val3 = int.Parse(textBox3.Text), val4 = 0, temp; 
     if (val3 < 5000000) 
     { 
      while (val4 < val3){ 
       temp = val1 + val2; 
       val1 = val2; 
       val2 = temp; 
       if (temp % 2 == 0) 
       { 
        evenTerms += 1; 
       } 
       val4++; 
      } 
     } 
     MessageBox.Show("" + evenTerms); 
+0

感謝您的輸入 – AppleKIdd

0

好,第一斐波那契數與1,1,2,3開始,...意味着你比列表領先一步。您應該從val1 = 1開始,並且val2 = 1;

https://en.wikipedia.org/wiki/Fibonacci_number

那你爲什麼用你的輸入參數作爲計算的一部分嗎?!

+1

斐波那契的第一個以0,1,1,2,3,...開頭 –

+0

@panther編碼器,你可以在我的答案中找到對維基百科的引用。你有更好的參考?分享鏈接,而不是你的信仰。 –

0
#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

int main() { 

typedef unsigned long ulong; 

ulong fib(ulong a, ulong b, ulong * odd_z, ulong n) { 
    ulong c = a + b; 
    if((c+b) >= n) { return 0; } 
    if(a%2 == 0) { *odd_z+=(b+c); } 
    return fib(b,c,odd_z, n); 
} 

int T; 
scanf("%d",&T); 
ulong odd_z = 0; 
ulong *sum = &odd_z; 

while(T--) { 
    ulong N; 
    scanf("%lu",&N); 
    fib(0,1,&odd_z, N); 
    printf("%lu\n",*sum); 
    *sum=0; 
} 
return 0; 

} 

這個算法ithm的時間和空間效率更高