biginteger模版,没有压位(较精简)

本文介绍了一个自定义的大整数类实现及其在递归公式中的应用。通过C++实现高精度加法、减法、乘法等操作,并演示了如何使用此类解决递归问题。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;

struct bigint 
{
	int a[10009],len;
	
	bigint()//构造函数 
	{
		memset(a,0,sizeof(a));
		len=0;
	}
	/**************************/
	bigint operator =(long long num)//高精度赋值int 
	{
		memset(a,0,sizeof(a));
		len=0;
		do
		{
			a[++len]=num%10;
			num/=10;
		}while (num);
		return *this;
	}
	/*********************************************************/
	bigint operator +(const int k)
	{
		bigint c;
		memcpy(c.a,a,sizeof(a));
		c.len=len;
		c.a[1]+=k;
		int i=1;
		while (c.a[i]>=10)////注意不要忘了加=号!!!!!!! 
		{
			c.a[i+1]+=c.a[i]/10;
			c.a[i]%=10;
			i++;
		} 
		if (i>c.len) c.len=i;
		return c;
	 } //高精度加单精度 
	 /************************/
	bigint operator +(const bigint &b)//高精度加高精度 
	{
		bigint c;
		c.len=max(len,b.len);
		for (int i=1;i<=c.len;i++)
		{
			c.a[i]+=a[i]+b.a[i];
			c.a[i+1]=c.a[i]/10;
			c.a[i]=c.a[i]%10;
		}
		if (c.a[c.len+1]) c.len++;
		return c;
	}
	/**************************************************/
	bigint operator *(const int b)//高精度乘单精度 
	{
		bigint c;
		memcpy(c.a,a,sizeof(a));
		c.len=len;
		for (int i=1;i<=c.len;i++) c.a[i]=c.a[i]*b;
		for (int i=1;i<=c.len;i++) c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
		while (c.a[c.len+1])
		{
			c.len++;
			c.a[c.len+1]=c.a[c.len]/10;
			c.a[c.len]%=10;
		}
		return c;
	}
	/***********************/
	bigint operator *(const bigint &b)//高精度乘高精度 
	{
		bigint c;
		c.len=len+b.len;
		for (int i=1;i<=len;i++)
			for (int j=1;j<=b.len;j++)
			c.a[i+j-1]+=a[i]*b.a[j];
		for (int i=1;i<c.len;i++)
		{
			c.a[i+1]+=c.a[i]/10;
			c.a[i]%=10;
		}	
		while (c.a[c.len]==0&&c.len>1) c.len--;
		return c;
	}
	/*******************************************/
	bigint operator -(const bigint &b)//高精度减高精度 
	{
		bigint c;
		c.len=len;
		for (int i=1;i<=c.len;i++)
		{
			if (a[i]<b.a[i]) a[i+1]--,a[i]+=10;
			c.a[i]=a[i]-b.a[i];
		}
		while (c.a[c.len]==0&&c.len>1) c.len--;
		return c;
	}
	/**************************************************/
	bool operator <(const bigint &b) const//比较符号 
	{
		if (len!=b.len) return len<b.len;
		for (int i=len;i>=1;i--) 
		if (a[i]!=b.a[i]) return a[i]<b.a[i];
		return false;
	}
	bool operator >=(const bigint &b) const  {return !(*this<b);} 
	/*---------------------------------------------------------------*/
};



void scan(bigint &b)//scanf式的输入 
{
	char ch[1009];
	scanf("%s",ch);
	int len=strlen(ch);
	for (int i=0;i<len;i++) b.a[len-i]=ch[i]-'0';
	b.len=len;
}
void print(bigint b)//print式的输出 
{
	for (int i=b.len;i>=1;i--) printf("%c",b.a[i]+'0');
}
/**********************************************************************/


istream& operator >>(istream &in,bigint &b)//cin的输入 
{
	char ch[10009];//注意这个不能开小了!!
	in>>ch;
	memset(b.a,0,sizeof(b.a));
	int len=strlen(ch);
	for (int i=0;i<len;i++) b.a[len-i]=ch[i]-'0';
	b.len=len;
	return in;
}

ostream& operator <<(ostream &out,const bigint &b)//iostream的输入输出
{
	for (int i=b.len;i>=1;i--) out<<(char)(b.a[i]+'0');
	return out;
}
/*********************************************/


bigint f[109];
int main()
{
	int n;
	scanf("%d",&n);
	f[1]=1;f[2]=5;
	bigint k1,k2;k1=3;k2=2;
	for  (int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+2;
	print(f[n]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值