算法竞赛备赛——【数论】高精度

高精度

高精度计算,也被称作大整数计算,运用了一些算法结构来支持更大整数间的运算(数字大小超过语言内建整型)。

加法

P1601 A+B Problem(高精) - 洛谷

#include
using namespace std;
const int N=10100;
int a[N],b[N],c[N];
	
int init(int x[]){//读入数 返回位数 
	string s; cin>>s;
	int l=s.size();
	for(int i=0;i=10){	//每位做运算 
			c[i]-=10;
			c[i+1]++;
		}
	}
	lc--;					
	while(c[lc]==0&&lc>0){	//去除前导0 
		lc--;
	}
	for(int i=lc;i>=0;--i){	//逆序输出 
		cout<

减法

P2142 高精度减法 - 洛谷

#include
using namespace std;
const int N=10100;
int a[N],b[N],c[N];
	
int init(int x[],string s){//读入数 返回位数 
	int l=s.size();
	for(int i=0;i>s1>>s2;
	if(s1.size()0){	//去除前导0 
		lc--;
	}
	for(int i=lc;i>=0;--i){	//逆序输出 
		cout<

乘法

P1303 A*B Problem - 洛谷

#include
using namespace std;
const int N=10100;
int a[N],b[N],c[N];
	
int init(int x[],string s){//读入数 返回位数 
	int l=s.size();
	for(int i=0;i>s1>>s2;
	int la=init(a,s1);
	int lb=init(b,s2);
	int lc=la+lb; 
	for(int i=0;i=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}				
	while(c[lc]==0&&lc>0){	//去除前导0 
		lc--;
	}
	for(int i=lc;i>=0;--i){	//逆序输出 
		cout<

除法

P1480 A/B Problem - 洛谷

#include
using namespace std;
const int N=10100;
int a[N],b[N],c[N];

//数组下标0的数用来存放数据长度 
void init(int x[],string s){
	x[0]=s.size();
	for(int i=1;i<=x[0];++i){
		x[i]=s[x[0]-i]-'0';
	}
}

bool check(int x[],int y[]){
	if(x[0]>y[0]) return 1;
	if(x[0]=1;--i){
		if(x[i]>y[i]) return 1;
		if(x[i]1){
		i--;
	}
	x[0]=i;
}

int main(){
	string s1,s2;cin>>s1>>s2;
	init(a,s1);
	init(b,s2);
	//去掉前导零
	while(a[a[0]]==0&&a[0]>1){
		a[0]--;
	} 
	while(b[b[0]]==0&&b[0]>1){
		b[0]--;
	}
	if(check(a,b)==0){
		cout<<0<=1;--i){
		int t[N]={0};
		for(int j=1;j<=b[0];++j){
			t[j+i-1]=b[j];
		}
		t[0]=b[0]+i-1;
		while(check(a,t)==1){
			sub(a,t);
			c[i]++;
		}
	} 
	while(c[c[0]]==0&&c[0]>1){
		c[0]--;
	}
	for(int i=c[0];i>=1;--i){
		cout<

你可能感兴趣的:(算法竞赛备赛,算法,c++,数据结构,蓝桥杯)