c++高精度

高精度是什么

计算数据过大超过long long的数据范围时,需要引进高精度算法。将数一位一位的存在数组中输出。

高精度加法

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char a1[10000], b1[10000];//字符存储数字
	int a[10000], b[10000], c[10000];//存储相加结果
	int len_a, len_b, len_c = 1, x, i;

	memset(a, 0, sizeof(a));//清零
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));

	cin >> a1 >> b1;//输入两个加数

	len_a = strlen(a1);//计算字符串长度
	len_b = strlen(b1);

	for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';//将加数存在a数组
	for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';//将另一个数存在b数组

	x = 0;//x为进位
	while (len_c <= len_a || len_c <= len_b)
	{
		c[len_c] = a[len_c] + b[len_c] + x;//两数相加,再加上前两个数进位的
		x = c[len_c] / 10;
		c[len_c] %= 10;
		len_c++;//位数++
	}
	c[len_c] = x;
	if (c[len_c] == 0)//判断首位是否为0
	{
		len_c--;//位数--
	}

	//输出每一位
	for (int i = len_c; i >= 1; i--)
	{
		cout << c[i];
	}

	return 0;
}

高精度减法

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char a1[10000], b1[10000];//字符存储数字
	int a[10000], b[10000], c[10000];//存储相减结果
	int len_a, len_b, len_c = 1, x, i;

	memset(a, 0, sizeof(a));//清零
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));

	cin >> a1 >> b1;//输入

	len_a = strlen(a1);//计算字符串长度
	len_b = strlen(b1);

	for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
	for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';

	i = 1;
	while (i <= len_a || i <= len_b)
	{
		if (a[i] < b[i])
		{
			c[i] = a[i] + 10 - b[i];
			a[i + 1]--;//借位
		}
		else
		{
			c[i] = a[i] - b[i];
		}
		i++;
	}
	len_c = i;
	while (c[len_c] == 0 && len_c > 1)
	{
		len_c--;
	}

	//输出每一位
	for (int i = len_c; i >= 1; i--)
	{
		cout << c[i];
	}

	return 0;
}

高精度乘法

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char a1[10000], b1[10000];//字符存储数字
	int a[10000], b[10000], c[10000];//存储相减结果
	int len_a, len_b, len_c = 1, x, i, j;

	memset(a, 0, sizeof(a));//清零
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));

	cin >> a1 >> b1;//输入

	len_a = strlen(a1);//计算字符串长度
	len_b = strlen(b1);

	for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
	for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';

	for (i = 1; i <= len_a; i++)
	{
		x = 0;
		for (j = 0; j <= len_b; j++)
		{
			c[i + j - 1] += x + a[i] * b[i];
			x = c[i + j - 1] / 10;//进位
			c[i + j - 1] %= 10;
		}
		c[i + len_b] = x;//进位的数
	}
	len_c = len_a + len_b;
	while (c[len_c] == 0 && len_c > 1)
	{
		len_c--;
	}

	
	
	//输出每一位
	for (int i = len_c; i >= 1; i--)
	{
		cout << c[i];
	}

	return 0;
}
相关推荐
山登绝顶我为峰 3(^v^)32 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
十五年专注C++开发5 小时前
CMake基础:条件判断详解
c++·跨平台·cmake·自动化编译
QuantumStack7 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6737 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext7 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
Jay_5159 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
xiaolang_8616_wjl10 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
FrostedLotus·霜莲10 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
liulilittle14 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
十年编程老舅15 小时前
跨越十年的C++演进:C++20新特性全解析
c++·c++11·c++20·c++14·c++23·c++17·c++新特性