大整数-综述-加法

来源:互联网 发布:且夫知不知 编辑:程序博客网 时间: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
原创粉丝点击