算法笔记 5.6 大整数运算 大整数的加减乘除

1.大整数数据结构(大整数的c语言描述)

标准约定:1.整数的高位存在数组的高位,低位存在数组的低位(四则运算都是从低位开始的,方便运算)
                   2.输入字符串于字符数组内,总是高位存在低位,低位存在高位,因此需要中间函数change()来转换
                   3.输出时,逆序输出(先输出高位,再输出低位)

#include	
#include	 
using namespace std;

const int N=1000;
char str[N];


//大整数数据结构
struct bign
{
	int d[N];//长度最大为1000
	int len;
	//构造函数初始化
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};

//字符串转大整数 逆序转
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for(int i=0;ib 1; ab.len) return 1;
	else if(a.len=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]=0;i--){
		printf("%d", a.d[i]);
	}
	printf("\n");
}

int main(){
	scanf("%s",str);
	bign a=change(str);
	scanf("%s",str);
	bign b=change(str);
	showBign(a);
	showBign(b);
	printf("%d\n", compare(a,b));
	return 0;
}

算法笔记 5.6 大整数运算 大整数的加减乘除_第1张图片

 

2.大整数加法  

设计得好就很简单了,11行就够了(妙在bign里面都是int值,运算时不用考虑字符与int的转换

先贴核心加法代码,遵循上述存储方法

//大整数加法  核心简洁代码
bign add(bign a,bign b){
	bign c;
	int carry=0;//进位
	for(int i=0;i

a+b实例

#include	
#include	 
using namespace std;

const int N=1000;
char str[N];

//大整数数据结构
struct bign
{
	int d[N];//长度最大为1000
	int len;
	//构造函数初始化
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};

//字符串转大整数 逆序转
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for(int i=0;ib 1; ab.len) return 1;
	else if(a.len=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]=0;i--){
		printf("%d", a.d[i]);
	}
	printf("\n");
}

//大整数加法  核心简洁代码
bign add(bign a,bign b){
	bign c;
	int carry=0;//进位
	for(int i=0;i

算法笔记 5.6 大整数运算 大整数的加减乘除_第2张图片

 

 

3.大数减法

同上,也很简洁,但是比加法稍微复杂

核心代码

//大整数减法  核心简洁代码
bign sub(bign a,bign b){//a-b 且必须a>b   小减大调用时自己处理
	bign c;
	for(int i=0;i=1&&c.d[c.len-1]==0){//第0位即使是0也不能删
		c.len--;
	}
	return c;
}

a-b实例

#include	
#include	 
using namespace std;

const int N=1000;
char str[N];

//大整数数据结构
struct bign
{
	int d[N];//长度最大为1000
	int len;
	//构造函数初始化
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};

//字符串转大整数 逆序转
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for(int i=0;ib 1; ab.len) return 1;
	else if(a.len=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]=0;i--){
		printf("%d", a.d[i]);
	}
	printf("\n");
}

//大整数减法  核心简洁代码
bign sub(bign a,bign b){//a-b 且必须a>b   小减大调用时自己处理
	bign c;
	for(int i=0;i=1&&c.d[c.len-1]==0){//第0位即使是0也不能删
		c.len--;
	}
	return c;
}


int main(){
	char str1[N],str2[N];
	scanf("%s%s",str1,str2);
	bign a=change(str1);
	bign b=change(str2);
	print(sub(a,b));
	return 0;
}

 

4.高精度与低精度的乘法

bign*int

技巧:将int始终看成一个整体,然后转换为+法 个位为值,其余为进位(乘法一般不会溢出,但最终结果是bign时,直接加会溢出)

核心代码:

//大整数减法  核心简洁代码
bign multi(bign a,int b){
	bign c;
	int carry=0;
	for(int i=0;i

A*b实例

#include	
#include	 
#include
using namespace std;

const int N=1000;
char str[N];

//大整数数据结构
struct bign
{
	int d[N];//长度最大为1000
	int len;
	//构造函数初始化
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};

//字符串转大整数 逆序转
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for(int i=0;ib 1; ab.len) return 1;
	else if(a.len=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]=0;i--){
		printf("%d", a.d[i]);
	}
	printf("\n");
}

//大整数减法  核心简洁代码
bign multi(bign a,int b){
	bign c;
	int carry=0;
	for(int i=0;i

 

5.高精度与低精度除法

核心代码

//大整数除法  核心简洁代码
bign divide(bign a,int b,int &r){//高精度除法 r为余数
	bign c;
	r=0;
	c.len=a.len;//被除数每一位和商每一位一一对应,因此先令其长度相等(最后的都视为余数)
	for(int i=a.len-1;i>=0;i--){
		r=r*10+a.d[i];//生成临时除数
		if(r=1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

A/b=c.....n实例

#include	
#include	 
#include
using namespace std;

const int N=1000;
char str[N];

//大整数数据结构
struct bign
{
	int d[N];//长度最大为1000
	int len;
	//构造函数初始化
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
};

//字符串转大整数 逆序转
bign change(char str[]){
	bign a;
	a.len=strlen(str);
	for(int i=0;ib 1; ab.len) return 1;
	else if(a.len=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]=0;i--){
		printf("%d", a.d[i]);
	}
	printf("\n");
}

//大整数除法  核心简洁代码
bign divide(bign a,int b,int &r){//高精度除法 r为余数
	bign c;
	r=0;
	c.len=a.len;//被除数每一位和商每一位一一对应,因此先令其长度相等(最后的都视为余数)
	for(int i=a.len-1;i>=0;i--){
		r=r*10+a.d[i];//生成临时除数
		if(r=1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

int main(){
	int n,r=0;
	scanf("%s%d",str,&n);//&别忘了
	bign a=change(str);
	print(divide(a,n,r));
	printf("r=%d\n", r);
	return 0;
}

算法笔记 5.6 大整数运算 大整数的加减乘除_第3张图片

 

 

你可能感兴趣的:(算法竞赛,算法笔记)