高精度

//fib高精度用二维数组存
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int n,len=1,f[5003][5003];
//f[k][i] --> 第k阶台阶所对应的走法数 
void hanhan(int k)//k来存阶数 
{    
    int i;
    for(i=1;i<=len;i++)
     f[k][i]=f[k-1][i]+f[k-2][i];
     
    for(i=1;i<=len;i++)  //进位 
     if(f[k][i]>=10){
         f[k][i+1]+=f[k][i]/10;
         f[k][i]=f[k][i]%10;
         if(f[k][len+1])len++;
    }
}
int main()
{
    int i;
    scanf("%d",&n);
    f[1][1]=1; f[2][1]=2;         //初始化 
    for(i=3;i<=n;i++)   hanhan(i);        //从3开始避免越界      
    for(i=len;i>=1;i--)  printf("%d",f[n][i]);xn--79qp02atl2bdna
    return 0;
}
//模板:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10000
using namespace std;
string A,B;
int a[N], b[N], c[N];
int len;

//高精度加法 满足 a >= 0  b >= 0  
void add(int a[], int b[]){
	len = max(A.size(),B.size());
	for(int i = 1; i <= len; i++){
		c[i] += a[i] + b[i];
		c[i+1] += c[i] / 10;	//模拟进位 
		c[i] %= 10;
	}
	if(c[len + 1]) len++; //加法最多进一位 
}
//高精度减法 满足 a >= b 且 a >= 0 b >= 0
void sub(int a[], int b[]){
	len = max(A.size(),B.size());
	for(int i = 1; i <= len ; i++){
		c[i] += a[i] - b[i];
		if(c[i] < 0){//借位 
			c[i] += 10;
			c[i+1] -= 1;
		}
	}
	while(len > 1 && !c[len]) len--; //删除前导 0  
}
//高精度乘低精度 A >= 0, b > 0
void mul(int a[], int x){
	int t = 0; len = A.size(); // t --> 进位 
	for(int i = 1; i <= len; i++){
		t += a[i] * x;
		c[i] = t % 10;
		t /= 10;
	}
	while(t){ c[++len] = t % 10, t /= 10; }//处理未进位的 t  
}
//高精度除低精度 a / b = C ... r, a >= 0, b > 0
void div(int a[], int x){
	int r = 0 ;// r --> 余数
	len = A.size();
	for(int i = len; i > 0; i--){
		//除法是从高位开始除
		 r = r * 10 + a[i];
		 c[i] = r / x;
		 r %= x; 
	 }
	 while(len > 1 && !c[len]) len--;//去前导0 
}
int main(){
	cin>>A>>B;
	for(int i = 0; i < A.size(); i++) a[A.size() - i] = A[i] - '0';
	for(int i = 0; i < B.size(); i++) b[B.size() - i] = B[i] - '0';
	//存储 A B 此时 a[1]存个位 a[2]存十位... 

//	add(a,b);  for(int i = len; i > 0; i--) cout<<c[i];cout<<endl;
//	sub(a,b);  for(int i = len; i > 0; i--) cout<<c[i];cout<<endl; 
//  int p;cin>>p;  mul(a,p);  for(int i = len; i > 0; i--) cout<<c[i];cout<<endl;
//  int p;cin>>p;  div(a,p);  for(int i = len; i > 0; i--) cout<<c[i];cout<<endl; 
	return 0;
}

posted @ 2021-02-21 22:57  Carrot_Rui  阅读(68)  评论(0)    收藏  举报