C/C++高精度四则运算模板

1.高精度加高精度(加法)

模拟小学算式
1 4 7
+ 6 5
2 1 2
现在模拟这个算式即可从低位到高位每一位相加
7 + 5 = 12 这一位应该为2, 而进位则为12 / 10 = 1
4 + 6 + 1 = 11 这一位为1,而进位则为11 / 10 = 1;
1 + 0 + 1 = 2 这一位为2
直接给模板代码,给出一定注释,因为时间原因,暂时解析后补。

/*
高精度加法模板,结构体实现 
*/
#include 
using namespace std;

struct bign{
   int d[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; i < a.len; i++) {
   	a.d[i] = str[a.len - i - 1] - '0';
   }
   return a;
}

bign add(bign a, bign b) {
   bign 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 != 0) {
   	c.d[c.len++] = carry;
   }
   return c;
}

void print(bign a) {
   for (int i = a.len - 1; i >= 0; i--) {
   	printf("%d", a.d[i]);
   }
} 

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

2.高精度减高精度(减法)

思路后补,代码有注释。

/*
高精度减法模板,结构体实现 
*/
#include 
using namespace std;

struct bign{
	int d[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; i < a.len; i++) {
		a.d[i] = str[a.len - i - 1] - '0';
	}
	return a;
}

bign sub(bign a, bign b) {
	bign 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;	//当前位加10 
		}
		c.d[c.len++] = a.d[i] - b.d[i];	//减法结果当前位 
	}
	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0) { 
		c.len--;	//去掉前导0 
	}
	return c; 
}

void print(bign a) {
	for (int i = a.len - 1; i >= 0; i--) {
		printf("%d", a.d[i]);
	}
} 

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

3.高精度*低精度(乘法)

思路后补:

/*
高精度加法模板,结构体实现 
*/
#include 
using namespace std;

struct bign{
	int d[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; i < a.len; i++) {
		a.d[i] = str[a.len - i - 1] - '0';
	}
	return a;
}

bign multi(bign a, int b) {
	bign 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 != 0) {
		c.d[c.len++] = carry % 10;
		carry /= 10;
	}
	return c;
}

void print(bign a) {
	for (int i = a.len - 1; i >= 0; i--) {
		printf("%d", a.d[i]);
	}
} 

int main() {
	char str1[1000];
	int b;
	scanf("%s%d", str1, &b);
	bign a = change(str1);
	print(multi(a, b));
	return 0;
}

4.高精度 / 低精度(除法)

思路后补:

/*
高精度加法模板,结构体实现 
*/
#include 
using namespace std;

int r;

struct bign{
	int d[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; i < a.len; i++) {
		a.d[i] = str[a.len - i - 1] - '0';
	}
	return a;
}

bign divide(bign a, int b, int &r) {
	bign 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;  //不够除,该位为0
		else {
			c.d[i] = r / b;  //商
			r %= b; //获得新的余数 
		} 
	} 
	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0) {	//去除前导0 
		c.len--;
	}
	return c;
}

void print(bign a) {
	for (int i = a.len - 1; i >= 0; i--) {	
		printf("%d", a.d[i]);	
	}
	printf("\n");
	printf("%d\n", r);  //打印余数 
} 

int main() {
	char str1[1000];
	int b;
	scanf("%s%d", str1, &b);
	bign a = change(str1);
	print(divide(a, b, r));
	return 0;
}

欢迎关注Blog:ly’s Blog

你可能感兴趣的:(C++,数论,大数/高精度)