大整数-综述-加法
来源:互联网 发布:且夫知不知 编辑:程序博客网 时间:2024/06/07 05:37
概述
高精度运算定义:所谓的高精度运算,是指操作数的范围超出了标准数据类型能表示的范围的运算。在32位机器里面,有符号整数(int)的取值范围是-2147483648~+2147483647。无符号整数的取值范围是0~42194967295。超过这个范围的数据可以用浮点数进行表示,但是浮点数来表示整数不便于整数的运算。浮点数运算无法实现整数的取余运算。另外如果操作数超过了浮点数的运算范围,比如一个1000位的整数,那么是无法用常规方法来处理。这些精度很高的数据通常称为高精度数或者大整数。
高精度运算思路:由于内置数据类型无法表示。所以,考虑用数组来存储参与运算的数的每一位。在运算的时候以数组元素所表示的位为单位进行运算。其主要的算法思路是模拟人工运算时的方法,按位依次进行处理即可。可以采用整数数组或者字符数组。具体情况视问题而定。
高精度加法运算
问题
[ jobdu-1198 ]
思路
由于所要处理的数字大小超过了语言内置类型的范围,可以考虑模拟人工进行四则运算的方法来实现大整数的运算。
具体来说:
1. 用数组(字符或者整型)来存储每一位数字。
2. 模拟人工方法,按位依次进行处理即可。从低位到高位,逐位相加,超过10的部分要”进位”
代码
/*input:多组输入;每一组输入a,b;用字符串进行输入。这是大整数的数据结构。用数组来存储数字,不是内置的数据类型。由于不是内置类型,所以没有相应类型的操作支持。只能是,自己去写这部分的操作。process: 1.计算a_len;b_len 2.初始化进位 c = 0 3.循环:(实现加法器功能)i < a_len || c > 0 3.1.累加当前位的和。 3.2.对当前位进行赋值 3.3.进位。 4.输出注意点我觉得主要是:要考虑 c > 0 循环任然可以进行的这种情形。*/#include <iostream>#include <string>#include <fstream>//#define LOCALstd::string bign_plus( const std::string& a, const std::string& b ); // 小端机存储 - 低字节存储数字的低位int main(){#ifdef LOCAL std::ifstream cin; cin.open( "input.dat" );#endif std::string a, b; while( std::cin >> a >> b ) { std::string ret = bign_plus(std::string(a.rbegin(), a.rend()), std::string(b.rbegin(), b.rend())); std::cout << std::string(ret.rbegin(), ret.rend()) << std::endl; }#ifdef LOCAL cin.close();#endif return 0;}std::string bign_plus( const std::string& a, const std::string& b ){ std::string ret; int a_sz = a.size(); int b_sz = b.size(); int c = 0; for( int i = 0; i < a_sz || i < b_sz || c; ++i) { int tmp = 0; if( i < a_sz && i < b_sz ) tmp = c + (a[i] - '0') + (b[i] - '0'); else if( i < a_sz ) tmp = c + (a[i] - '0'); else if( i < b_sz ) tmp = c + (b[i] - '0'); else if( c > 0 ) tmp = c; ret.push_back( static_cast<char>(tmp % 10 + '0') ); c = tmp / 10; } return ret;}
注意
整形数组还是字符数组?
- 整形数组:
- 优点:每一位都是数的形式。便于直接进行计算
- 缺点:不能直接输入输出
- 字符数组:
- String型字符串最大长度是255,可以表示255位。当然,也可以单纯用字符数组char arr[maxn]
- 优点:可以直接进行输入输出
- 缺点:每一位是字符,不能直接进行计算,需要先转换。
一种建议的做法是,用字符串读入数据,用整型数组存储数据。刘汝佳在白书的bign模板中就是这么写的。
1 0
- 大整数-综述-加法
- 大整数加法
- 大整数加法
- 高精度 大整数加法
- 大整数加法
- 大整数加法
- 大整数加法
- 大整数加法
- 大整数加法计算
- zoj1292大整数加法
- 大整数加法
- 大整数加法
- 大整数加法函数
- 大整数加法
- 大整数加法
- 大整数加法
- 大整数加法
- 大整数加法
- Xilinx Virtex6 GTX Transceiver设计总结
- UVA 562 Dividing coins (01背包)
- [HDU 4609] 3-idiots (计数+FFT优化卷积)
- 【学习笔记】抽象类
- 视频播放功能模块
- 大整数-综述-加法
- UIView中的各种坐标转换convertPoint:toView OR convertPoint:fromView
- HTML5基础篇之html(二)
- linux qcom LCD framwork
- 如何由RGB计算HSV空间的色相值
- Android——数据存储(四种方式之二)读写SD卡
- CSS包含块(Containing Block)
- 【学习笔记】接口
- 高性能协程库State Thread Library源代码剖析之一Makefile详解