【C++】【算法】高精度加减乘除

C++高精度算法————减法 高精度减法(High Precision Subtraction)是一种用于处理超过原生数据类型范围的大整数或高精度小数的计算技术。与高精度加法类似,高精度减法也需要使用自定义的数据结构和算法来进行计算。在函数内部,我们首先判断 num1 是否大于等于 num2,如果不满足则抛出异常。然后,我们通过逐位减法,处理借位来得到结果。需要注意的是,上述的代码示例仅展示了一种简单的实现方式,对于大规模的高精度计算,可能需要考虑优化算法或使用专门的高精度计算库。函数进行高精度减法,并打印结果。函数,接受两个大整数。 阅读详情
AI摘要

本文介绍了C++中高精度算法的实现。由于C++内置类型数据存储范围有限,无法进行超出范围的高精度运算,因此借助string和数组实现。详细阐述了高精度加法、减法、乘法和除法的算法思路、代码实现及特殊情况处理,还提及了高精度算法的应用场景。

0 引言

在用C++写代码时,为了解决各种问题,我们会经常使用到加减乘除,我们对加减乘除运算也再熟悉不过。

但是,C++作为一门强类型语言,不管是使用short,int,亦或是long long,对数据存储范围都是有限的; 

类型大小范围
short2字节-32768 ~ 32767
int4字节-2147483648~2147483647
long long8字节-2^63 ~ 2^63-1

当我们加减乘除要运算的数超过数据存储的范围时就无法进行运算,否则会导致越界造成严重的后果,那我们如果要进行这样高精度的计算,就需要使用到算法来对其进行实现,这种算法也可称为高精度算法,能实现高精度的运算;

1 高精度算法的介绍以及思路

当我们由于储存范围的原因无法使用C++的内置类型来进行运算时,我们可以借助STL库中的string来得到要计算的数据,再将string中的数据存入一个数组中,然后对数组中的每一位进行相应的运算,最后的结果存入数组中进行输出,我们的高精度算法也就完成了;

算法思路:

2 高精度加法

对于高精度加法,我们在处理完数据逆序存储于字符串中之后,对每一位进行加法运算,随后处理好进位,如下:

 我们先定义一个全局变量,当做数组的大小,该全局变用户可根据需要自行改变,确保其能存下我们需要计算的数据:

const int N = 1e6 + 10;

再定义三个全局数组,分别存储两个要计算的数据和结果

int a[N], b[N], c[N];

然后定义三个全局变量表示三个数据的长度

int la, lb, lc;

先看第一步:将string中要计算的数据,逆序存储于数组中

cin得到要相加的两个数据,并使用string自带的size功能得出三个数据的长度la,lb,lc,结果的长度是两个要加的数据中大的数据的长度,如果说相加到最高位时还有进位,那么lc的长度应为la+1,这种特殊情况后面会单独处理:

string x, y;
cin >> x >> y;

la = x.size(), lb = y.size(), lc = max(la, lb);

如果要让字符串中的数据逆序存储于数组中,即a[0] = x[la - 1 - 0] ; a[1] = x[la -1 - 1] ; a[2] = x[la -1 - 2];  可以发现,其下标的和正好为la - 1,因此,可以直接得出循环,实现逆序存储:

	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

这里千万注意,字符串x,y中存储的是字符,当将其转移到数组中时应当减去字符0(‘ 0 ’);

随后正常执行算法,然后输出,得到基本框架:

	add(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;

下面来实现add算法:

对于数组中的两个数据相加,如下图所示,假设这两个数是1001和9099:

代码实现:

for (int i = 0; i < lc; ++i)
{
	c[i] += a[i] + b[i];
	c[i + 1] = c[i] / 10;
	c[i] %= 10;
}

注意:循环中第一个语句一定是c[i] += a[i] + b[i] ,因为还要算上进位,而第二步即得到进位,进位存储于下一个下标;c[i]本身的值去掉进位后即为c[i] % 10;

在这一步之后还需要更新lc的值,如果在加到最高位之后仍然有进位,那么lc的值应该加1,便于后序输出:

if (c[lc]) ++lc;

由此得到完整的add算法(参数可写可不写,因为是全局的):

void add(int* a, int* b, int* c)
{
	for (int i = 0; i < lc; ++i)
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / 10;
		c[i] %= 10;
	}

	if (c[lc]) ++lc;
}

完整代码如下:

#include <iostream>
#include <string>
using namespace std;

const int N = 1e6 + 10;

int a[N], b[N], c[N];

int la, lb, lc;

void add(int* a, int* b, int* c)
{
	for (int i = 0; i < lc; ++i)
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / 10;
		c[i] %= 10;
	}

	if (c[lc]) ++lc;
}

int main()
{
	string x, y;
	cin >> x >> y;

	la = x.size(), lb = y.size(), lc = max(la, lb);
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

	add(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

测试:

3 高精度减法

高精度减法的基本框架和add基本一致,只是在算法的实现上有所区别,先写出其基本框架:

void del(int* a, int* b, int* c)
{
	
}

int main()
{
	string x, y;
	cin >> x >> y;

	la = x.size(), lb = y.size(), lc = max(la, lb);
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

	del(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

在此框架的基础上,在将string中的数据拷入数组之前,我们要求x > y,方便后序的减法操作,如果x < y的话,得到的结果应该是一个负数,要先输出符号,然后交换a, b的值;

因此,在进行del之前,应该先比较a,b的值,如下所示:

if (cmp(x, y))
{
	// x < y
	cout << '-';
	swap(x, y);
}

实现cmp:

x,y是两个字符串,我们知道两个字符串比较大小是按照字典序进行比较,也就是说,9会比666666这个字符串还要大,所以我们不能直接使用大小于号进行比较,我们应该先比较其长度,若长度,长度长的,这个数一定更大,长度若相同,则按照字典序进行比较:

bool cmp(string& x, string& y)
{
	if (x.size() != y.size()) return x.size() < y.size();
	return x < y;
}

若x比y小返回真;

再来对del进行实现,del和add有所不同的是,在del的for循环中,a[i]和b[i]要进行相减的运算,这个运算结果暂时存储于c[i]中,如果说c[i] 小于0,说明要向下一位进行借位,那么c[i+1]应当--,同时c[i] 应当 + 10,实现如下:

for (int i = 0; i < lc; ++i)
{
	c[i] += a[i] - b[i];
	if (c[i] < 0)
	{
		--c[i + 1];
		c[i] += 10;
	}
}

在进行了如上循环后,还有一种特殊情况,比如9999 - 9999,按照如上循环得到的c中的结果应该为0000,因为lc的长度没有改变,所以我们需要做进一步处理,在有效数字之前不能存在0,即要去掉前导0,但结果若为0000,还需保留一个0,所以lc的长度至少要为1,如下:

while (lc > 1 && c[lc - 1] == 0) --lc;

完整代码如下:

#include <iostream>
#include <string>
using namespace std;

const int N = 1e6 + 10;

int a[N], b[N], c[N];

int la, lb, lc;

void del(int* a, int* b, int* c)
{
	for (int i = 0; i < lc; ++i)
	{
		c[i] += a[i] - b[i];
		if (c[i] < 0)
		{
			--c[i + 1];
			c[i] += 10;
		}
	}

	while (lc > 1 && c[lc - 1] == 0) --lc;
}

bool cmp(string& x, string& y)
{
	if (x.size() != y.size()) return x.size() < y.size();
	return x < y;
}

int main()
{
	string x, y;
	cin >> x >> y;

	if (cmp(x, y))
	{
		// a < b
		cout << '-';
		swap(x, y);
	}

	la = x.size(), lb = y.size(), lc = max(la, lb);
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

	

	del(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

测试:

4 高精度乘法

高精度乘法的基本框架也是和add基本一致,只是在算法的实现上有所区别,先写出其基本框架:

void mul(int* a, int* b, int* c)
{

}

int main()
{
	string x, y;
	cin >> x >> y;

	la = x.size(), lb = y.size(), lc = la + lb;
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

	mul(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

这里需要注意的是,lc的大小不再是la和lb较大的那个值,而是la+lb,因为对于两个数相乘,积的长度不会超过两个数的位数之和;

对于高精度乘法,对两个数列竖式计算乘法,如果向我们一般列竖式的做法,整个过程会变得非常麻烦,我们应该采用另一种更简单的方法来列竖式计算———不进制列竖式乘法,即在列竖式时直接写出相乘的结果,在相加后再统一进制,对123×456这两个数进行演示:

对于a,b和c,有这样的规律 ->  a[ i ] * b[ j ]的值刚好是c[ i + j ]处值的叠加,因此,只需要两个for循环就能初步完成这个算法:

for (int i = 0; i < la; ++i)
{
	for (int j = 0; j < lb; ++j)
	{
		c[i + j] += a[i] * b[j];
	}
}

此时得到的c中存储的数据还没有进位,所以我们要对其中的数据进行进位:

	// 进位
	for (int i = 0; i < lc; ++i)
	{
		c[i + 1] += c[i] / 10;
		c[i] %= 10;
	}

同样的,如果是0*9999,得到的结果会是00000,我们还是要处理前导0;

while (lc > 1 && c[lc - 1] == 0) --lc;

完整代码如下所示:

#include <iostream>
#include <string>
using namespace std;

const int N = 1e6 + 10;

int a[N], b[N], c[N];

int la, lb, lc;


void mul(int* a, int* b, int* c)
{
	for (int i = 0; i < la; ++i)
	{
		for (int j = 0; j < lb; ++j)
		{
			c[i + j] += a[i] * b[j];
		}
	}

	// 进位
	for (int i = 0; i < lc; ++i)
	{
		c[i + 1] += c[i] / 10;
		c[i] %= 10;
	}

	while (lc > 1 && c[lc - 1] == 0) --lc;
}

int main()
{
	string x, y;
	cin >> x >> y;

	la = x.size(), lb = y.size(), lc = la + lb;
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';
	for (int i = 0; i < lb; ++i) b[i] = y[lb - 1 - i] - '0';

	mul(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

测试:

注意,此代码默认输入的两个数为正整数,如果需要计算负数,则在计算之前使用一下绝对值,根据同号为正异号为负的规则先输出符号再正常计算,比较简单,这里不多做演示;

5 高精度除法

对于高精度除法,我一般不研究高精度÷高精度,没什么意义,只需要研究高精度÷低精度足矣,所以其框架会和加减乘有所不同,这里只有被除数需要存储进一个数组,除数则不需要,除出来的结果可能很大,也需要存储进一个数组中;

先写出基本框架:

#include <iostream>
#include <string>
using namespace std;

const int N = 1e6 + 10;

int a[N], b, c[N];

int la, lc;

void sub(int* a, int b, int* c)
{
	
}

int main()
{
	string x;
	cin >> x >> b;

	la = x.size(), lc = la;
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';

	sub(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

被除数与结果的长度是一样的;

对于sub算法,我们要使用的方法是这样的,以1234 ÷ 45来示范:

sub初步实现如下:

为了使精度的容错更高,余数可能很大,所以我们将t定义为long long类型:

typedef long long LL;

void sub(int* a, int b, int* c)
{
	LL t = 0;
	for (int i = lc - 1; i >= 0; --i)
	{
		t = t * 10 + a[i];
		c[i] = t / b;
		t %= b;
	}
}

同样的,高精度除法也需要去除前导0:

	while (lc > 1 && c[lc - 1] == 0) --lc;

完整代码如下:

#include <iostream>
#include <string>
using namespace std;

const int N = 1e6 + 10;

int a[N], b, c[N];

int la, lc;

typedef long long LL;

void sub(int* a, int b, int* c)
{
	LL t = 0;
	for (int i = lc - 1; i >= 0; --i)
	{
		t = t * 10 + a[i];
		c[i] = t / b;
		t %= b;
	}

	while (lc > 1 && c[lc - 1] == 0) --lc;
}

int main()
{
	string x;
	cin >> x >> b;

	la = x.size(), lc = la;
	for (int i = 0; i < la; ++i) a[i] = x[la - 1 - i] - '0';

	sub(a, b, c);

	for (int i = lc - 1; i >= 0; --i) cout << c[i];
	cout << endl;

	return 0;
}

测试:

6 总结

高精度算法的应用场景广泛,如加密货币交易和挖矿过程中用于处理大数运算,确保交易的安全性和准确性;在物理和化学模拟中提供更精确的计算结果等。

在处理高精度计算时,需要处理好以下几个问题:

  1. 数据的接收方法和存储方法。
  2. 进位、借位的处理。

总之,高精度算法是解决C++中超出常规数据类型表示范围的数值运算的重要手段,通过合理的设计和实现,可以提高程序的计算能力和准确性。

C++算法——高精度加法 c++算法——高精度加法 阅读详情

相关推荐

[C++实现]高精度算法

​ 在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加、减、乘、除、乘方、阶乘、开方等运算。 对于一个很大的数字N >= 10^ 100,很显然这样的数字无法在计算机中正常存储。于是, 我们想到了办法,将这个数字拆开,拆成一位一位的或者是四位四位的存储到一个数组中,用一个数组去表示一个数字。这样这个数字就被称谓是高精度数。 对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度

m0_71229255的博客 2500

C++的高精度加法

为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。所以我们需要知道高精度计算。更详细的解释,可以参考这个网页https://blog.youkuaiyun.com/justidle/article/details/104414459。 高精度加法计算原理 在读小学时,我们做加法都采用竖式方法,如图 1 ...

努力中的老周的专栏 1万+

高精度加减乘除算法C++实现

#include&lt;bits/stdc++.h&gt; using namespace std; int a[100001],b[100001],c[100001],ans[100001],la,lb,lans,i,j,k,flag; string s1,s2; char ch; int main() { cin&gt;&gt;s1&gt;&gt;s2; la=s1.size(...

qq_38685596的博客 488

C++基础算法①——高精度加减法计算

高精度导论、高精度+低精度、高精度+高精度、高精度减法。

博樽 1万+

c++_csp-j算法 (6)_高精度算法(加减乘除)

C++高精度算法是指在C++编程语言中实现高精度计算的算法。在C++中,通常整数的范围是有限的,超出这个范围的整数计算会导致溢出。高精度算法的出现,使得C++程序能够处理超出常规整数范围的大整数计算,包括高精度加法、减法、乘法、除法等运算。在C++中实现高精度算法通常会使用大整数类(BigInteger Class)或者自定义数据结构(如数组、链表等)来表示大整数,以实现高精度计算。这些数据结构能够存储和处理超出常规整数范围的大整数,同时提供了相应的运算方法来实现高精度算法。

曾梦想仗剑走天涯,梦想AK天下WA 2047

【c++】算法:高精度(经典加减乘除){含解析(图解)}

Hi~o(* ̄▽ ̄*)ブ,今天来一起看看c++算法之高精度 之后会持续更新有关c++算法系列,欢迎观看!(#^.^#)

2301_79982543的博客 3212

高精度算法(cpp)加减乘除大合集

总所周知int型存储的数的大小是有很大限制的,所以我们在计算超大数的加减乘除时就要用到高精度算法。主要思想就是把超大数的每一位都存储在数组中,然后运用我们小学所学的竖式计算来进行计算。c++比较需要,java和Python有更方便的选择。

普通大学的普通学生的一些学习记录博客 439

面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题

文章目录1.将一根木棒截成三段,问能够组成三角形的概率;2.在圆上任取三点,问能够组成锐角、直角、钝角三角形的概率;3.共有25匹马,找出最快的3匹,只有5个赛道,每次比赛只能得到5匹马的速度排序,最少需要多少次比赛;4 有两瓶红蓝墨水,体积一样,现在从红墨水中舀一勺加入蓝墨水中,搅拌均匀后,在从蓝墨水中舀一勺加到红墨水中,试问这两瓶墨水哪瓶纯度更高。 1.将一根木棒截成三段,问能够组成三角形的概率; 来源:https://blog.youkuaiyun.com/weixin_41245919/article/deta

weixin_41558411的博客 4906

高精度算法 c++ 加减乘除

最后:代码还是要自己动手,光看记不住的(深有体会)。此文章是我关于高精度的写法模板,具体思路还是得探索。四,高精度除法(高精÷低精)

S511511666的博客 801

AI训练加速30%!用numactl玩转多显卡绑核的隐藏技巧

本文深入探讨了如何利用Linux系统的numactl工具,通过精确的NUMA绑核策略优化多GPU AI训练性能。文章详细解析了NUMA架构对性能的影响,提供了从拓扑探查、命令实战到多卡脚本化部署的完整指南,并分享了性能验证与常见陷阱,帮助开发者实现高达30%的训练加速。

web99的专栏 448

Unity URP风格化水面Shader全流程实现与性能优化指南

在游戏开发中,Shader是实现特定视觉风格的核心技术,它通过编写在GPU上运行的程序,控制模型每个像素的最终颜色与光照表现。其原理在于对顶点位置、纹理坐标、光照信息及深度等数据进行一系列数学运算与插值。这项技术的价值在于能够以极高的自由度创造从写实到卡通的各种渲染效果,同时通过算法优化实现对硬件资源的精准控制。在移动游戏、独立游戏等对性能与风格化有强烈需求的场景中,自定义Shader尤为重要。本文聚焦于使用Unity URP渲染管线,从零构建一个高效的风格化水面Shader,详细拆解了深度色、波浪动画、边

weixin_34320724的博客 371

C/C++ 高精度(加减乘除)算法实现

前言 C/C++基本类型做算数运算长度有限,但也基本满足大部分场景使用了,有时需要计算大长度数据时就有点无能为力了,比如1000的阶乘结果就有2000位,用基本类型是无法计算的。 高精度的算法,一般的方式是用一个很长的数组去记录数据,数组的每一位记录固定位数的数字,记录顺序是低到高位。计算方式则通常采用模拟立竖式计算。计算方法有一些优化,比如FFT快速傅里叶变换优化乘法,牛顿迭代优化除法。 方法采用的,就是上述的一般方式,用数组从低到高位记录数据,计算方式采用模拟立竖式计算。 一、定义一些必要的参数 1、计

codeofcc的博客 4077

iOS马甲包过审实战:如何用5天时间搞定4.3审核(附完整代码混淆方案)

本文提供了一套为期五天的高效实战方案,专门解决iOS应用因重复或抄袭问题而被App Store的4.3条款拒绝的难题。方案涵盖深度分析、代码混淆、资源翻新及环境隔离等系统性步骤,并附有完整的代码混淆示例,旨在帮助开发者在合规框架内重塑应用,显著提升过审成功率。

weixin_29234239的博客 147

【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算

C++ 本身自带的数字类型无法解决特别大的数的运算,会出现溢出的情况,这时候我们就需要一些算法来模拟大数的运算过程,从而得到最终的结果。 接下来我将带领大家学会高精度的加减乘除运算,这样以后再遇到类似问题就不用再怕啦!

Newin2020的博客 2178

【毕设级教程】从0到1实现基于YOLOv8的UA-DETRAC交通目标检测系统(含UI界面,助力智能交通毕设)

本项目基于YOLOv8模型和UA-DETRAC数据集开发了一个交通目标检测系统,包含数据处理、模型训练和可视化界面全流程。UA-DETRAC数据集包含多种交通场景下的车辆标注,通过格式转换适配YOLOv8训练要求。系统采用PyQt开发交互界面,支持图像检测、结果显示等功能。该项目技术路线清晰,既展现深度学习在智能交通中的应用,又提供完整的可视化展示方案,适合作为计算机视觉相关毕业设计选题。

m0_64661770的博客 150

LPDDR5 学习笔记08:电气参数设计要求

本文详细阐述了LPDDR5内存接口的关键电气规范和时序要求。主要内容包括:1)绝对最大额定值限制及长期工作可靠性说明;2)差分时钟信号(CK/WCK)的输入电压、转换速率和交叉点电压规范;3)单端时钟信号的定义和测量方法;4)时钟周期、抖动(周期抖动、相邻周期抖动)和累积误差的精确计算方法;5)片选信号在同步/异步模式下的接收器规范;6)命令地址信号和数据信号的接收器掩模定义及脉冲宽度要求。所有参数均严格定义了测量条件和合规标准,为LPDDR5接口设计提供了完整的电气规范参考。

一只豌豆象的博客 1177

算法磨剑:用 C++ 思考的艺术》:面试官让你写高精度算法?加减乘除 4 步走,抄作业都能过!

本文聚焦算法入门的高精度计算,针对加减乘除四种场景,结合例题拆解核心逻辑(如加法进位、除法余数处理),提供可直接套用的模板代码,解决普通数据类型存放大数溢出问题,助力轻松应对大数计算类题目

2403_88424194的博客 1431

抖音小程序:解决获取手机号报错 getPhoneNumber:fail auth deny,登录注册时需要获取用户手机号,getPhoneNumber一直提示错误(Uniapp抖音小程序报错也能解决)

抖音字节小程序获取手机号报错getPhoneNumber:fail auth deny,抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth ,抖音小程序获取手机号始终返回拒绝,抖音小程序获取手机号,已经过了试运营期但依旧报错如何解决,调用 tt.getPhoneNumber 接口报错,登录注册时需要获取用户手机号,getPhoneNumber一直提示getPhoneNumber:fail auth deny,此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;unia

✅ 精选推荐文章 4305

C++高精度加减乘除算法详解

高精度算法的本质是「模拟手工计算」,所有运算都围绕「进位、借位」展开,核心步骤:存储:低位在前、高位在后,用vector<int>存储每一位;运算:逐位处理,手动维护进位/借位;输出:转换为字符串,去除前导零,处理正负号。

李熠专用博客_白帽子一枚,人称低危终结者。免费收徒,有意者私信!!! 676

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3991

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

高精度算法加减乘除详解c++

目录 输入 关于进位 输出 高精度加法 高精度减法 高精度乘法 高精度除法 输入 输入数时用数组存储,将每一位数储存进数组 string a; int na[100001]; void lay(string a) { int len1 = a.size(); for (int i = 0;i < len1;i++) { na[len1 - 1 - i] = a[i] - '0'; } } 关于进位 加法 na[i] += nb[i] + carry;//每一位相

qq_53077129的博客 922

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 整数高精度加减乘除四则运算 算法

这里的除法包括高精度除以低精度和高精度除以高精度哦~这些写法可能不是最优的,但是至少比较好懂(毕竟我这个小白都懂了)。并且这里要求输入的数都是正常的整数形式,比如,不能是000114514而是114514.

qq_62111349的博客 1440

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ 基于vector的高精度算法 思路+代码(加减乘除)

C++ 用vector进行高精度的运算,包括加减乘除,其中有高精度X低精度,高精度X高精度,高精度/低精度,高精度/高精度

qq_39991776的博客 1950

《C++基础算法一【高精度加减乘除】》

目录高精度加法高精度减法高精度乘法高精度除法 高精度加法 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的和。 数据范围 1≤整数长度≤100000 输入样例: 12 23 输出样例: 35 解题思路:加法进位 #include<iostream> #include<vector> using namespace std; /* 计算两数之和,将他们的和值push进tmp数组中,如果还考虑需要进位的话只需要将

m0_53421868的博客 359

C++高精度算法模板(加减乘除)

主函数模板 加减法模板 #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int>a,b; int main(){ string s1,s2; cin>>s1>>s2; for(int i=s1.size()-1;i>=0;i--)a.push_back(s1[i]-'0'); fo

lwdn旭 1178

C/C++ 高精度(加减乘除)算法二进制优化

上一章《C/C++ 高精度(加减乘除)算法压位优化》实现了优化的高精度计算,采用int32的整型数组每个元素可以储存9个10进制数字,想要再进一步优化计算速度,可以改变数据存储方式,采用二进制存储数字。依然采用int32数组其元素通过二进制来存储数字,这样做不仅运算效率高,而且空间利用率也达到了最高。以上就是今天要讲的内容,二进制存储优化在对比压9位优化速度还有提升,而且存储方式与整型一样,很好的利用了空间。相比较与压9位算法,二进制算法对于乘法和除法的提升较大,尤其是长数据运算的提升更为明显。

codeofcc的博客 2458
上一篇: 链表的环的问题
下一篇: 【C】C语言内存操作函数的解析
鼓浪屿Estelle
博客等级 码龄3年 307粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值