什么是总和条款甚至在斐波那契(<4万)?[大价值的数据类型的混乱]

StackOverflow https://stackoverflow.com/questions/1644446

  •  10-07-2019
  •  | 
  •  

由开始的1和2,第10条件的斐波那契数列将是:

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

找到这笔所有的甚至值计算顺序不超过4万美元。


现在,我的想法对于如何做到这一点。但我很困惑的有关数据类型以举行如此大的数据。我越来越怪异的结果 int. :(

更多:其项目Euler第2个问题。但我不能得到它。我疯狂的价值观作为回答。可以请人员额的理想计划吗?

编辑:这是我写的只是打印的斐波那契到屏幕上。裸露的基础。我的变量超疯狂即使当我给100的限制。是我的码是错误的?

// Simple Program to print Fibonacci series in Console
#include <stdio.h>
int main() {
    int x=1,y=2,sum=0,limit=0,i=0,temp=0;
    printf("Enter Limit:");
    scanf("%d",&limit);

    if(limit==1)
        printf("%d",x);
    else if(limit>1) {
        printf("%d %d",x,y);
        if (limit>2) {
            while (i<limit-2) {
                temp=y;
                sum=x+y;
                x=temp;
                y=sum;
                printf(" %d",sum);
                i++;
            }
        }
    }      

    printf("\n");
    return 0;
}

解决:实际上,我设法获得解决自己。这是我的节目。它的工作。

#include <stdio.h>
int main() {
    int x=1,y=2,sum,limit;     //Here value of first 2 terms have been initialized as 1 and 2
    int evensum=2;             //Since in calculation, we omit 2 which is an even number
    printf("Enter Limit: ");   //Enter limit as 4000000 (4million) to get desired result
    scanf("%d",&limit);
    while( (x+y)<limit ) {
        sum=x+y;
        x=y;
        y=sum;
        if (sum%2==0)
            evensum+=sum;
    }
    printf("%d \n",evensum);
    return 0;
}
有帮助吗?

解决方案 9

大家好,我得到了答案。我确认结果和INT可以处理它。下面是我的程序:

#include <stdio.h>
int main() {
    int x=1,y=2,sum,limit;     //Here value of first 2 terms have been initialized as 1 and 2
    int evensum=2;             //Since in calculation, we omit 2 which is an even number
    printf("Enter Limit: ");   //Enter limit as 4000000 (4million) to get desired result
    scanf("%d",&limit);
    while( (x+y)<limit ) {
        sum=x+y;
        x=y;
        y=sum;
        if (sum%2==0)
            evensum+=sum;
    }
    printf("%d \n",evensum);
    return 0;
}

THX所有答复和帮助。 “我的脚思考”营救:)

其他提示

由于您只想高达四百万,很可能是int是不是你的问题。

这很可能是你的程序是越野车,并且数据存储就好了,所以你应该在较小的值来测试你的程序。例如,很明显,第一个三个连项的总和是44(提示:每一个第三项是偶数),所以如果你用50帽运行您的程序,那么你应该立即得到44回。继续运行小测试案例来获得在较大的信心。

有关的安全性,使用“长”数据类型; C标准要求保持至少4十亿,但在大多数机器上,“INT”也将容纳4十亿。

enum { MAX_VALUE = 4000000 };
int sum  = 0;
int f_n0 = 0;
int f_n1 = 1;
int f_n2;

while ((f_n2 = f_n0 + f_n1) < MAX_VALUE)
{
    if (f_n2 % 2 == 0)
        sum += f_n2;
    f_n0 = f_n1;
    f_n1 = f_n2;
}
printf("%d\n", sum);

尝试改变这样的:

while (i<limit-2)

这样:

while (y<limit)

作为写入,你的程序循环直到它到达第四百万斐波那契数(即当我得到400万,虽然溢出明显首先发生)。循环还应当检查以查看当y(较大Fibonacci数)变得大于4000000。

我不是一个程序员,但这里有一个适应莱弗勒的代码无需IF-标准。它应该MAX_VALUES工作上面2(鉴于有编程语法没有错误)的基础上,我在偶数只有斐波纳契数列发现一个规律:0,2,8,34,144,610,2584 ......这样有趣的是:f_n2 = 4 * f_n1 + f_n0。这也意味着该程序只需要计算的1/3,因为它不考虑连/计算奇数斐波那契数。

enum { MAX_VALUE = 4000000 };
int sum  = 2;
int f_n0 = 0;
int f_n1 = 2;
int f_n2 = 8;

while (f_n2 < MAX_VALUE)
{
    sum += f_n2;
    f_n0 = f_n1;
    f_n1 = f_n2;
    f_n2 = 4*f_n1 + f_n0;
}
printf("%d\n", sum);

int是几乎每一个现代系统上数以百万计值足够大,但你可以使用long如果你担心它。如果仍然让你奇怪的结果,那么,问题是你的算法。

使用 BigInt.

然后再一次, unsigned int 商店的价值超过了4亿美元,所以你不应该有任何问题,甚至与"总和所有斐波那契数字达到4亿"(其中,显然必须小于8英里)?

一个错误,你可能看到的是你的printf()语句的坏格式。 与随后一个printf( “%d”)一个printf( “%d%d”),3号,5,8,13,21,34,55将打印为:     3 5 813 21 3455 这肯定看起来像一个疯狂的数字不恰当的时髦输出。 你需要几个多个空格或换行符:输出( “%d%d \ n” 个),的printf( “%d \ n” 个)

我还没有看到你实际上只检查偶数条款作出贡献的总和。

你的计划的打印F_1+..+F_limit和不F_1+...F_n与F_n < 限制你的描述。

检查维基百科上的文章 斐波那契数字斯隆A000045:斐波那契数呈指数增长。检查这个 F_48=4807526976超过int。F_100是354224848179261915075这一定的溢出,即使int64_t(堆栈不,虽然).

这是有趣的解决方案是使用封闭形式为斐波纳契序列和几何级数的封闭形式。最终解决方案是这样的:

  sum = ( (1-pow(phi_cb, N+1)) / (1-phi_cb) - (1-pow(onephi_cb,N+1)) / (1-onephi_cb)) / sqrt(5);

,其中

  double phi       = 0.5 + 0.5 * sqrt(5);
  double phi_cb    = pow(phi, 3.0);
  double onephi_cb = pow(1.0 - phi, 3.0);
  unsigned N = floor( log(4000000.0 * sqrt(5) + 0.5) / log(phi) );
  N = N / 3;

与所有关于当然双为int型转换的注意事项。

在Fibonacci序列中的每个新项是通过将先前的两个术语生成。通过用1和2开始,第一10项将是:

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

通过考虑其值不超过4万元斐波那契序列的条款,发现即使值项的总和。

   int main()

  {  
     long first = 1, second = 2, next, c;

     int sum=0;
     for ( c = 1 ; c <100000000; c++ )

  {

     next = first + second;
     if(next>=4000000)
     {
     next=  next-second;
     break;
     }

     first = second;
     second = next;    

  if(next%2==0){

     sum=sum+next;
  }

 }

  printf("the sum of even valued  term is %d\n",sum+2);


 }  

下面是我的程序:

#include <iostream>

long int even_sum_fibonacci(int n){
    int i = 8;
    int previous_i = 2;
    int next_i = 0;
    long int sum = previous_i + i;;
    while(n>next_i){
        next_i = i*4 + previous_i;
        previous_i = i;
        i = next_i;
        sum = sum + i;
    }
    return sum - next_i; //now next_i and i are both the bigger number which
                         //exceeds 4 million, but we counted next_i into sum
                         //so we'll need to substract it from sum
}



int main()
{
   std::cout << even_sum_fibonacci(4000000) << std::endl; 

   return 0;
}

因为如果你看一下斐波纳契数列(在最初的几个偶数) 的 2 8 34 144 610 2584 ... 你会看到,它的图案匹配 的 next_number = CURRENT_NUMBER * 4 + previous_number

这是解决方案之一。所以结果是的 4613732

可以尝试下面的代码。

public static void SumOfEvenFibonacciNumbers()
{
    int range = 4000000;
    long sum = 0;
    long current = 1;
    long prev = 0;
    long evenValueSum= 0;
    while (evenValueSum< range)
    {
        sum = prev + current;
        prev = current;
        current = sum;
        if (sum % 2 == 0 )
        {
            evenValueSum = evenValueSum+ sum;
        }
    }

    Console.WriteLine(evenValueSum);
}

你可以利用上述编码。

import numpy as np
M = [[0,1],[1,1]]
F = [[0],[1]]
s = 0
while(F[1][0] < 4000000):
 F = np.matmul(M, F)
 if not F[0][0]%2:
   s+=F[0][0]

print(s)

我们可以做比这更好的在O(日志n)的时间。此外,在2×2矩阵以及一个两个三维矢量,可以成倍增加再次在O(1)的时间。因此,它足以计算Mn.以下递归算法计算Mn

  1. 若n=0,返回我2
  2. 若n=1,M.返回
  3. 若n=2m。
  4. 递归算N=Mm, ,并设置P=N2.
  5. 若n=2m+1,设置P=点。
  6. 回P.我们有T(n)=T(n/2)+O(1),并通过主的定理T(n)=O(日志n)

你也可以使用复发为即使是斐波那契数列的是:EFn=4EFn-1+EFn-2 与种子的价值 EF0=0和EF1=2.

简单的解决办法是: -

#include <iostream>
using namespace std;

int main(int argc, char** argv) {   
int n1=1;
int n2=2;
int num=0,sum;

for (int i=1;i,n1<4000000;i++)
{

    cout<<"    "<<n1;
    num=n1+n2;
    if(!(n1%2))
    {
        sum+=n1;
    }
    n1=n2;
    n2=num;     
}
cout<<"\n Sum of even term is = "<<sum;
return 0;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top