数学之高精度(续)于2020/7/29

hdu 1047

考点:高精度加法
注意输出格式,输出错误三次(没好好看题)

** hdu 1063

考点:实数的高精度幂
说真的这有点坑人,因为没想过写实数的高精度(你把double放哪儿了)

找到的题解里重新定义了大实数的结构体,现场写也不是不可以,但是恐怕会花很长很长时间(凭我的编码水平写这么大代码量…)

hdu 1316

考点:大数比较
套模板卡了很久!
是因为没有注意范围(开的数组太小了,进行相加操作溢出了,显示的是WA而不是RTE)

#include<bits/stdc++.h>
using namespace std;
int compare(int a[],int b[])   //比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0
{
	int i;
	if (a[0]>b[0]) return 1;//a的位数大于b则a比b大
	if (a[0]<b[0]) return -1;//a的位数小于b则a比b小
	for(i=a[0];i>0;i--)  //从高位到低位比较
    {
	 	if (a[i]>b[i]) return 1;
      	if (a[i]<b[i]) return -1;
	}
	return 0;//各位都相等则两数相等。
}
void read1(string s1,int a[])
{
	//cin>>s1;
	memset(a,0,sizeof a);
	a[0]=s1.length(); //位数
	for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';//将字符转为数字并倒序存储.
}
int x[1010][110];
int y[110];

int gplus(int a[],int b[]) //计算a=a+b
{
	int i,k;
	k=a[0]>b[0]?a[0]:b[0]; //k是a和b中位数最大的一个的位数
	for(i=1;i<=k;i++)
    {	
		a[i+1]+=(a[i]+b[i])/10;  //若有进位,则先进位
    	a[i]=(a[i]+b[i])%10;
	}  //计算当前位数字,注意:这条语句与上一条不能交换。
	if(a[k+1]>0) a[0]=k+1;  //修正新的a的位数(a+b最多只能的一个进位)
    else a[0]=k;
}

void prepare()
{
	x[1][0]=1,x[1][1]=1;
	x[2][0]=1;x[2][1]=2;
	y[0]=1,y[1]=2;
	for(int i=1;i<=500;i++)
	{
		gplus(y,x[i]);
		for(int j=0;j<=y[0];j++)
		x[i+2][j]=y[j];
	}
	
}
int main()
{
	prepare();
	string s1,s2;
	/*
	for(int i=1;i<=1000;i++)
	{
		for(int j=x[i][0];j>=1;j--)
		{
			cout<<x[i][j];
		}
		cout<<endl;
	}
	*/
	int ss1[110],ss2[110];
	while(cin>>s1>>s2)
	{
		if(s1=="0"&&s2=="0")return 0;
		memset(ss1,0,sizeof ss1);
		memset(ss2,0,sizeof ss2);
		read1(s1,ss1);
		
		read1(s2,ss2);
		
		int ans=0;
		for(int i=1;i<=500;i++)
		{
			if(compare(x[i],ss1)>=0&&compare(ss2,x[i])>=0)ans++;
			if(compare(ss2,x[i])<0)break;
		}
		cout<<ans<<endl;
	} 
}

hdu5686

递推+高精度加法(和楼上一模一样的说?)

#include<bits/stdc++.h>
using namespace std;
int compare(int a[],int b[])   //比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0
{
	int i;
	if (a[0]>b[0]) return 1;//a的位数大于b则a比b大
	if (a[0]<b[0]) return -1;//a的位数小于b则a比b小
	for(i=a[0];i>0;i--)  //从高位到低位比较
    {
	 	if (a[i]>b[i]) return 1;
      	if (a[i]<b[i]) return -1;
	}
	return 0;//各位都相等则两数相等。
}
void read1(string s1,int a[])
{
	//cin>>s1;
	memset(a,0,sizeof a);
	a[0]=s1.length(); //位数
	for(int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-'0';//将字符转为数字并倒序存储.
}
int x[1010][110];
int y[110];

int gplus(int a[],int b[]) //计算a=a+b
{
	int i,k;
	k=a[0]>b[0]?a[0]:b[0]; //k是a和b中位数最大的一个的位数
	for(i=1;i<=k;i++)
    {	
		a[i+1]+=(a[i]+b[i])/10;  //若有进位,则先进位
    	a[i]=(a[i]+b[i])%10;
	}  //计算当前位数字,注意:这条语句与上一条不能交换。
	if(a[k+1]>0) a[0]=k+1;  //修正新的a的位数(a+b最多只能的一个进位)
    else a[0]=k;
}

void prepare()
{
	x[1][0]=1,x[1][1]=1;
	x[2][0]=1;x[2][1]=2;
	y[0]=1,y[1]=2;
	for(int i=1;i<=500;i++)
	{
		gplus(y,x[i]);
		for(int j=0;j<=y[0];j++)
		x[i+2][j]=y[j];
	}
	
}
int main()
{
	prepare();
	int n;
	while(cin>>n)
	{
		for(int i=x[n][0];i>0;i--)
		cout<<x[n][i];
		cout<<endl;
	} 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值