ما هو المبلغ حتى المصطلحات في فيبوناتشي (<4million)?[قيمة كبيرة نوع البيانات الارتباك]

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

  •  10-07-2019
  •  | 
  •  

سؤال

من خلال البدء مع 1 و 2 ، 10 الأولى من حيث سلسلة فيبوناتشي سوف يكون:

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

العثور على مبلغ من كل شيء حتى تقدر المصطلحات في تسلسل التي لا يتجاوز 4 ملايين.


الآن لدي فكرة عن كيفية القيام بذلك.ولكن أنا في حيرة حول أنواع البيانات إلى عقد مثل هذه البيانات الكبيرة.أنا على الحصول على نتائج غريبة مع int. :(

المزيد:مشروع يولر 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

شباب انا حصلت على الجواب.لقد أكدت النتيجة الباحث يمكن التعامل معها.وهنا البرنامج:

#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;
}

شكرا لجميع الردود و المساعدة."التفكير على قدمي" إلى الإنقاذ :)

نصائح أخرى

منذ كنت تريد فقط تصل إلى أربعة ملايين ، فمن المحتمل أن 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)

كما هو مكتوب ، البرنامج الخاص بك ركوب الدراجات حتى يحصل على 4 مليون فيبوناتشي رقم (أيعندما يحصل على 4 ملايين ، على الرغم من تجاوز الواضح أن يحدث أولا).حلقة يجب أن تحقق عندما انظر ص (أكبر رقم فيبوناتشي) يصبح أكبر من 4 مليون.

أنا لست مبرمج ولكن هنا التكيف مع Leffler رمز دون إذا-معيار.يجب أن تعمل 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 %d") تليها printf(" %d"), عدد 3, 5, 8, 13, 21, 34, 55 سوف طباعة:3 5 813 21 3455 والتي بالتأكيد يبدو غير تقليدي الإخراج مع غير ملائم الأرقام.كنت في حاجة الى عدد قليل من أكثر الأماكن أو linefeeds:printf("%d %d ") ، printf(" %d ").

أنا أيضا لا أرى أين أنت فعلا التحقق فقط حتى من حيث المساهمة في المبلغ.

البرنامج يطبع F_1 + ..+ F_limit وليس F_1 + ...F_n مع F_n < الحد كما وصفته أنت.

التحقق من مقالة ويكيبيديا عن أرقام فيبوناتشي و سلوان A000045:أرقام فيبوناتشي ينمو باطراد.التحقق من هذا الجدول F_48 = 4807526976 الذي يتجاوز الباحث.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-نوع التحويلات بالطبع.

كل مصطلح جديد في سلسلة فيبوناتشي يتم إنشاؤها عن طريق إضافة حيث السابقتين.من خلال البدء مع 1 و 2 ، 10 الأولى من حيث ستكون:

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

من خلال النظر في الشروط في سلسلة فيبوناتشي القيم التي لا تتجاوز أربعة ملايين العثور على مبلغ حتى تقدر الشروط.

   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(log n) مرة.وعلاوة على ذلك ، 2 × 2 مصفوفة ثنائية البعد ناقلات يمكن أن تتضاعف مرة أخرى في س(1) مرة.ولذلك يكفي أن حساب مn.التالية خوارزمية العودية يحسب مn

  1. إذا كان n = 0, العودة أنا2
  2. إذا كان n = 1, عودة م.
  3. إذا كان n = 2m.
  4. بشكل متكرر حساب N = Mم, وتعيين P = N2.
  5. إذا كان n = 2m+1, مجموعة P = مساء.
  6. العودة P.لدينا T(n) = T(n/2) + O(1) ، ماجستير نظرية T(n) = O(log 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