【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

Claude Skills:不是更聪明,而是更“像专家”的 Agent 养成方法

Claude Skills 不是在告诉 Agent“你能做什么”, 而是在约束它“你应该如何思考、如何判断、如何给结论”。

测试者家园 1294

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

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

S511511666的博客 801

RPG MV游戏数据修改指南:从JSON解析到脚本进阶

游戏数据修改是游戏开发与逆向工程中的常见实践,其核心原理在于解析和操作游戏资源文件。许多现代游戏引擎采用结构化数据格式(如JSON)存储游戏配置,这为外部修改提供了可能。通过理解文件结构、数据格式与游戏逻辑的关联,开发者或爱好者可以调整游戏平衡、修复问题或实现个性化定制,这不仅能深化对游戏设计机制的理解,也具备实际的技术学习价值。本文以基于Web技术栈的RPG Maker MV(RPG MV)引擎为例,其游戏数据多以明文JSON存储,结构清晰。文章将具体阐述如何安全地修改角色属性、物品效果、敌人数据及技能公

weixin_29001419的博客 404

Wireshark教程:解密HTTPS流量

Wireshark教程:如何解密HTTPS流量

nuan444979的博客 1万+

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

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

codeofcc的博客 4077

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

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

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

Newin2020的博客 2178

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

CUBEMX ADC 单/多通道+DMA

本文使用的是STM3F103C8T6 Cubemx进行单/多通道DMA配置。

记录学习 1403

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

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

2403_88424194的博客 1431

JavaScript性能优化:全链路性能优化策略

JavaScript性能优化是提升Web应用质量的核心要素,直接影响用户体验与业务成果。研究表明,页面加载延迟1秒可能导致转化率下降7%。高效的JavaScript执行能减少主线程阻塞,避免动画卡顿或操作延迟,尤其在移动端低性能设备上更为关键。优化内存管理与减少冗余计算可降低浏览器资源消耗,防止因内存泄漏导致的崩溃,提升应用稳定性。在竞争激烈的互联网环境中,性能优势已成为产品差异化的关键因素,直接影响用户留存与商业价值。因此,性能优化应作为开发全周期的核心实践,而非事后补救措施。

weixin_49707375的博客 1270

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

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

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

华为OD机考双机位C卷 - 斗地主之顺子 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 斗地主之顺子(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 9693

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

高精度算法加减乘除详解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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

qq_62111349的博客 1440

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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、付费专栏及课程。

余额充值