poj 3070 求第n个斐波那契数 矩阵 二分

http://poj.org/problem?id=3070

#include<iostream>
#include<cstdio>
using namespace std;
int a[4];

void j(int n)
{
    int q,b,c,d;
    if(n==1)
    {
        a[0]=1;a[1]=1;a[2]=1;a[3]=0;
    }
    else
    {
        j(n/2);
        q=a[0]*a[0]+a[1]*a[2];
        b=a[0]*a[1]+a[1]*a[3];
        c=a[2]*a[0]+a[3]*a[2];
        d=a[2]*a[1]+a[3]*a[3];
        a[0]=q%10000; a[1]=b%10000; a[2]=c%10000; a[3]=d%10000;
        if(n%2==1)
        {
           q=a[0]+a[1];
            b=a[0];
             c=a[2]+a[3];
            d=a[2];
            a[0]=q%10000; a[1]=b%10000; a[2]=c%10000; a[3]=d%10000;
        }
    }
}
        
int main()
{
    int n;    
    while(scanf("%d",&n),n!=-1)
    {
        if(n==0)
            printf("0\n");
       else
       {
          j(n);
        
        
         printf("%d\n",a[1]);
       }
    }
    return 0;
}

        

一开始我 两个矩阵相乘再弄了一个函数 返回一个数组的指针 貌似是 指针那里 出错了  具体怎么 错的 我也没搞清。。

贴一下代码  求大神指点

#include<iostream>
using namespace std;


int *solve(int *a,int *b)  
{
    int c[4];
    c[0]=a[0]*b[0]+a[1]*b[2];
    c[1]=a[0]*b[1]+a[1]*b[3];
    c[2]=a[2]*b[0]+a[3]*b[2];
    c[3]=a[2]*b[1]+a[3]*b[3];
    return c;
}

int *j(int n,int *a)
{
    if(n==1)
        return a;
    int *temp;
    temp=solve(j(n/2,a),j(n/2,a));
   if(n%2==0)
        return temp;
    int p[4]={1,1,1,0};
    return solve(temp,p);
}

int main()
{
    int n;    
    while(scanf("%d",&n),n!=-1)
    {
        int a[4]={1,1,1,0};
        int *w;
        w=j(n,a);
        printf("%d\n",w[1]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/assult/p/3101969.html