使用用户输入查找所有偶数Fibonacci数的总和

时间:2017-03-19 18:47:20

标签: c# user-input fibonacci

目前,我正在编写程序,在用户输入的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);

任何人都可以帮我解决问题吗?

感谢。

4 个答案:

答案 0 :(得分:1)

我建议使用 generator 枚举所有斐波那契数字:

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());

答案 1 :(得分: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);

答案 2 :(得分:0)

好吧,Fibonacci的第一个以1,1,2,3开头,......这意味着你比名单领先一步。你应该从val1 = 1开始,val2 = 1;

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

那么为什么你使用输入参数作为计算的一部分?!!

答案 3 :(得分: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;

}

此算法也更具时间和空间效率