Nisy 发表于 2009-9-22 11:45:47

斐波那契第2009项目

// MyFei.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string.h>
#define MAX 1000000000
#define LEN 1004

void BigNumAdd(int * num1,int * num2,int * len1,int * len2)
{
    int temp = 0;
    for(int i=0;i<*len2;i++)
    {
      num1 += num2 + temp;// += <==> +()
      temp = num1/MAX;
      num1%=MAX;
    }
    num1+=temp;
    if(*len1 < *len2)
    {
      *len1 = *len2;         
    }
    if(num1)
      (*len1)++;// 再次犯下同样的错误
}

void ShowBigNum(int * num1,int len1)
{
    if(!num1)len1--;
    printf("%d",num1);
    for(int k=len1;k>=0;k--)
      printf("%09d",num1);
    printf("\r\n");
}

int main(int argc, char* argv[])
{
    int * num1 = new int;
    int * num2 = new int;
    memset(num1,0,sizeof(int)*100);
    memset(num2,0,sizeof(int)*100);
    int len1,len2;
    len1 = len2 = num1 = num2 = 1;
    for(int i=0;i<LEN;i++)
    {
      BigNumAdd(num1,num2,&len1,&len2);
      BigNumAdd(num2,num1,&len2,&len1);
    }
    printf("斐波那契数列第%d项为:\r\n",LEN*2+1); // 单项+1 双项+2
    ShowBigNum(num1,len1);
    return 0;
}

斐波那契数列第2009项为:
32113249982681582845238472032097086207406078264369213828207269738873528372164658
13601607624368278410255618945484808988900205426234968094236646697230669809316249
08775724739402394881483009611433054415348267177640331222672835631629564907858584
30785050847615157489167011704773920617812432061755619769908742336741418110524930
07153851287942959207659531735086437334610990020876787656487609216126565715584580
25510084617009128909
请按任意键继续. . .

超然 发表于 2009-9-22 21:41:33

很好,很强大

学习

wmp1014 发表于 2009-9-23 21:14:32

就想知道这题。

xusir98 发表于 2009-9-23 21:19:32

...

展望明年,就是飞不拉鸡的第2010项了!

Nisy 发表于 2009-9-23 21:47:33

这个大数加法的精髓在这句话上:

#define MAX 1000000000

搞明白这个 就什么都明白了

evilknight 发表于 2009-9-24 18:42:27

膜拜一下大牛!

Nisy 发表于 2009-9-24 20:59:12

原帖由 evilknight 于 2009-9-24 18:42 发表 https://www.chinapyg.com/images/common/back.gif
膜拜一下大牛!

膜拜下小齐 再膜拜一下 ~~

dabing85 发表于 2009-9-24 22:13:39

#include   <stdio.h>   
#include   <malloc.h>   
#include   <memory.h>   

#define   UNIT_VALUE 1000000000L   
#define   STEP_VALUE 43   
#define   PRINT_SIZE 9   

typedef   int   int32;   

void   main()   
{   
        int32   n,i;   
        int32   size;   
        int32   *p,*q,*r,*s;   
        //
starthere:
       
        printf("Please input a number n to calculate the nth Fibonaccinumber:");   
       
        scanf("%d",&n);   
        if(n<=0)   
        {   
                printf("1\n");   
                return;   
        }
       
        size=(n+STEP_VALUE-1)/STEP_VALUE;   
       
        p=(int32   *)malloc(size*sizeof(int32));   
        q=(int32   *)malloc(size*sizeof(int32));   
        r=(int32   *)malloc(size*sizeof(int32));   
        memset(p,0,size*sizeof(int32));   
        memset(q,0,size*sizeof(int32));   
        memset(r,0,size*sizeof(int32));   
       
        q=1;
       
        for(i=1;i<n;i++)   
        {   
                int32   j;   
                int32   limit=(i+STEP_VALUE-1)/STEP_VALUE;   
                int32   carry=0;   
                for(j=0;j<limit;j++)   
                {   
                        int32   result;   
                        result=p+q+carry;   
                        if(result>=UNIT_VALUE)   
                        {   
                                carry=1;   
                                result-=UNIT_VALUE;   
                        }   
                        else   
                        {   
                                carry=0;   
                        }   
                        r=result;   
                }   
               
               
                s=p;   
                p=q;   
                q=r;   
                r=s;   
        }   
        for(i=size-1;i>=0;i--)   
        {   
                if(q!=0)   
                        break;   
        }   
       
        printf("%d",q);
       
        for(;i>=0;i--)   
        {   
                printf("%0*d",PRINT_SIZE,q);   
        }   
        printf("\n");
       
        free(p);   
        free(q);   
        free(r);   
        goto   starthere;   
}   



看到过的一个例子 检验过了 可以用。

backer 发表于 2009-9-25 00:47:11

节约只有两个字
1111234567890 2345678901 3456789012
+9876543210 8765432109 7654321098
======================================>

   0000000000 0000000000 3456789012
+0000000000 0000000000 7654321098
----------------------------------------
   0000000000 000000000? ??????????
+0000000000 2345678901 0000000000

+0000000000 8765432109 0000000000
+1234567890 0000000000 0000000000
+9876543210 0000000000 0000000000

[ 本帖最后由 backer 于 2009-9-25 00:49 编辑 ]
页: [1]
查看完整版本: 斐波那契第2009项目