13.大整数/高精度运算重难点剖析

13.大整数/高精度运算重难点剖析

1.大整数的储存

如何储存:

struct bigshu{  //定义一个结构体 来储存大整数
	int d[1000];
	int len;
	
	bigshu()  //构造函数 →初始化 
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};

如何赋值:

因为整数的高位存在数组的高位,整数的低位存在数组的低位,运算时都是从低位向高位枚举,故逆向输入,与实际思维相符合!

bigshu fuzhi(char x[])  //定义赋值函数
{
	bigshu a;
	a.len=strlen(x);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=x[a.len-i-1]-'0'; //逆向输入
	}
	return a;
}

如何比较两个大整数的大小

int bijiao(bigshu a,bigshu b) //a大 相等 a小 分别返回 1 0 -1 
{
	if(a.len>b.len) return 1;   //先比较长度
	else if(a.len<b.len) return -1;  //先比较长度
	else  //长度相等再来比较个位数的大小  从高位开始
	{
		for(int i=a.len-1;i>=0;i--)  //从高位开始枚举
		{ 
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]<b.d[i]) return -1;
		}	
		return 0;
	} 
} 

如何输出

void print(bigshu a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		cout<<a.d[i];  //从高位向低位输出
	}	
} 

                                    下面是例子【只适用于非负数运算-有待改进】

高精度加法

#include <bits/stdc++.h>
using namespace std;
struct bigshu{
	int d[1000];
	int len;
	
	bigshu()  //构造函数 →初始化 
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
bigshu fuzhi(char x[]) //将数组存入结构统一
{
	bigshu a;
	a.len=strlen(x);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=x[a.len-i-1]-'0'; //逆向赋值 
	}
	return a;
}

bigshu jiafa(bigshu a,bigshu b) //高精度加法
{
	bigshu c;
	int carry=0;
	for(int i=0;i<a.len||i<b.len;i++)
	{
		int temp=a.d[i]+b.d[i]+carry;
		c.d[c.len++]=temp%10;
		carry=temp/10;	
	}	
	if(carry)
	{
		c.d[c.len++]=carry;
	}
	return c;
} 
void print(bigshu a)  //输出函数
{
	for(int i=a.len-1;i>=0;i--)
	{
		cout<<a.d[i];
	}	
} 
int main()
{
	char x1[1000]={},x2[1000]={};
	cin>>x1>>x2;
	bigshu a,b;
	a=fuzhi(x1);
	b=fuzhi(x2);
	print(jiafa(a,b));
	return 0;
}

高精度减法

#include <bits/stdc++.h>
using namespace std;
struct bigshu{
	int d[1000];
	int len;
	
	bigshu()  //构造函数 →初始化 
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
bigshu fuzhi(char x[])
{
	bigshu a;
	a.len=strlen(x);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=x[a.len-i-1]-'0'; //逆向赋值 
	}
	return a;
}
int bijiao(bigshu a,bigshu b) //a大 相等 a小 分别返回 1 0 -1 
{
	if(a.len>b.len) return 1;
	else if(a.len<b.len) return -1;
	else
	{
		for(int i=a.len-1;i>=0;i--)
		{
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]<b.d[i]) return -1;
		}	
		return 0;
	} 
} 
bigshu jianfa(bigshu a,bigshu b)
{
	bigshu c;
	for(int i=0;i<a.len||i<b.len;i++)
	{
		if(a.d[i]<b.d[i])
		{
			a.d[i+1]--;
			a.d[i]+=10;
		}
		c.d[c.len++]=a.d[i]-b.d[i];
	}
	while(c.len-1>=1&&c.d[c.len-1]==0) c.len--;
	return c;
} 
void print(bigshu a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		cout<<a.d[i];
	}	
} 
int main()
{
	char x1[1000]={},x2[1000]={};
	cin>>x1>>x2;
	bigshu a=fuzhi(x1),b=fuzhi(x2);
	int psd=bijiao(a,b);
	if(psd==1) print(jianfa(a,b));
	else if(psd==0) cout<<0;
	else if(psd==-1) 
	{
		cout<<"-";
		print(jianfa(b,a));
	}
	return 0;
}

高精度与低精度乘法

#include <bits/stdc++.h>
using namespace std;
struct bigshu{
	int d[1000];
	int len;
	
	bigshu()  //构造函数 →初始化 
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
bigshu fuzhi(char x[])
{
	bigshu a;
	a.len=strlen(x);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=x[a.len-i-1]-'0'; //逆向赋值 
	}
	return a;
}
bigshu chengfa(bigshu a,int b)
{
	bigshu c;
	int carry=0;
	for(int i=0;i<a.len;i++)
	{
		int temp=a.d[i]*b+carry;
		c.d[c.len++]=temp%10;
		carry=temp/10;	
	}	
	while(carry)
	{
		c.d[c.len++]=carry%10;
		carry/=10;
	}
	return c;
} 
void print(bigshu a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		cout<<a.d[i];
	}	
} 
int main()
{
	char x1[1000]={};
	int x2;
	cin>>x1>>x2;
	bigshu a=fuzhi(x1);
	print(chengfa(a,x2));
	return 0;
}

高精度与低精度除法

#include <bits/stdc++.h>
using namespace std;
struct bigshu{
	int d[1000];
	int len;
	
	bigshu()  //构造函数 →初始化 
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
bigshu fuzhi(char x[])
{
	bigshu a;
	a.len=strlen(x);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=x[a.len-i-1]-'0'; //逆向赋值 
	}
	return a;
}
bigshu chufa(bigshu a,int b,int& r)
{
	bigshu c;
	c.len=a.len;
	for(int i=a.len-1;i>=0;i--)
	{
		r=r*10+a.d[i];  //和上一位的余数结合
		if(r<b) c.d[i]==0;
		else
		{
			c.d[i]=r/b;
			r%=b;	
		} 
	}
	while(c.len-1>=1&&c.d[c.len-1]==0)  c.len--;
	return c;
}
void print(bigshu a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		cout<<a.d[i];
	}	
} 
int main()
{
	char x1[1000]={};
	int x2=0,yu=0;
	cin>>x1>>x2;
	bigshu a=fuzhi(x1);
	print(chufa(a,x2,yu));
}

发布了26 篇原创文章 · 获赞 26 · 访问量 3603

猜你喜欢

转载自blog.csdn.net/xg987599519/article/details/104061309
今日推荐