标签:
链接:点击打开链接
题意:给出一个n,求斐波那契的前四位和后四位,并按照XXXX...XXXX的格式输出,如果不足八位直接全部输出
代码:
#include <iostream> #include <stdio.h> #include <math.h> #define Mod 10000 using namespace std; long long f[100]; const int MAX=2; typedef struct{ long long m[MAX][MAX]; }Matrix; Matrix P={0,1,1,1}; Matrix I={1,0,0,1}; Matrix matrixmul(Matrix a,Matrix b){ int i,j,k; Matrix c; for(i=0;i<MAX;i++) for(j=0;j<MAX;j++){ c.m[i][j]=0; for(k=0;k<MAX;k++) c.m[i][j]+=(a.m[i][k]*b.m[k][j])%Mod; c.m[i][j]%=Mod; } return c; } //矩阵乘法 Matrix quickpow(long long n){ Matrix m=P,b=I; while(n>= 1){ if(n&1) b=matrixmul(b,m); n=n>>1; m=matrixmul(m,m); } return b; } //矩阵快速幂 int main(){ long long a[50],i,j,n,cur; double tp=(sqrt(5)+1)/2,t; Matrix temp; a[0]=0;a[1]=1; for(i=2;i<=39;i++){ a[i]=a[i-1]+a[i-2]; // cout<<a[i]<<endl; } while(scanf("%lld",&n)!=EOF){ if(n<=39){ cout<<a[n]<<endl; continue; } temp=quickpow(n); //前四位数推导公式: cur=temp.m[0][1]; //s=d.xxx*10^(len-4) t=n*log10(tp)-0.5*log10(5.0); //log10(s)=log10(d.xxxxx)+log10(10^(len-4))=log10(d.xxxx)+len-4 t-=floor(t); //log10(s)+4-len=log10(d.xxxx) t+=3; //d.xxxx=10^(log10(s)+4-len) t=pow(10,t); //s=(1/sqrt(5))*[(1+sqrt(5))/2.0]^i while(t<1000) //len=(int)log10(s)+1 t*=10; //d.xxxx=10^(log10(s)+4-((int)log10(s)+1))=10^(log10(s)-(int)log10(s)+3) printf("%lld...",(long long)t); printf("%04d\n",cur); //用%04d输出后四位 } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47611507