C++ 实现高精度的计算

高精度

高精度数通常使用数组来储存,一般高位在后,低位在前(为了方便处理在最高位进位时的插入操作)

高精度加法

按照手算加法的过程一样即可,需要注意处理进位
代码:

//A,B是两个数组,分别存放两个待加的高精度数
vector<int> add(vector<int> &A, vector<int> &B){
    int t = 0;
    vector<int> C;
    for(unsigned i = 0; i < A.size() || i < B.size(); ++i){
        if(i < A.size()) t += A[i];
        if(i < B.size()) t += B[i];
        C.push_back(t%10);
        t /= 10;
    }
    if(t) C.push_back(1);
    return C;
}
高精度减法

高精度减法依然是模拟手算减法的操作,需要注意借位,还有要去除掉前导零。这里保证了A一定大于等于B,所以需要一个比较A和B大小的函数,保证始终是绝对值大的减去绝对值小的。
代码:
```cpp
bool cmp(vector &A, vector &B){
if(A.size() != B.size()) return A.size() > B.size();//大小不相等就直接比较二者的大小
for(int i = A.size() - 1; i >= 0; --i){ //大小相等就从最高位这逐一比较
if(A[i] != B[i]) return A[i] > B[i];
}
return true;
}

vector sub(vector &A, vector &B){
int t = 0;
vector C;
for(unsigned i = 0; i < A.size(); ++i){
t = A[i] - t; //A[i]减去上一位可能的借位
if(i < B.size()) t -= B[i]; //如果B对应位置还有数,就继续减去B[i]
C.push_back((t+10) % 10); //得到相应位的数字,这一步操作对t>0和t<0都有效
if(t < 0) t = 1; //考虑借位
else t = 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back(); //去除前导零
return C;
}
```

原文地址:https://www.cnblogs.com/patrolli/p/11461275.html

时间: 2024-10-12 09:16:29

C++ 实现高精度的计算的相关文章

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

高精度整数计算

        这部分主要是学习一下计算  无法用内置整数类型来保存它的值(即位数多到long long都表示不了)  的整数的加法和乘法         这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项.  下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加 题目描述 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数

number-precision Js高精度数学计算Npm包

这两天在用node编写一个有关于金融计算的自动脚本,传输的内容包含了2位小数的加减计算,由于JS自身的计算原因,所以找到了这个数据计算包number-precision非常的好用,使用方法见链接 http://npm.taobao.org/package/number-precision 原文地址:https://www.cnblogs.com/aboys/p/11548202.html

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数

定时器:为 Windows 实现一个连续更新,高精度的时间供应器

原著:Johan Nilsson 翻译:lxhui 原文出处:MSDN Magazine March 2004(Timers...) 原代码下载: HighResolutionTimer.exe (404KB) 本篇文章假定你熟悉 C++ 和 Win32 API  概要   从 Windows NT 里获得的时间戳(Timestamp),根据你所使用的硬件,其最大精度为 10 到 15 毫秒.但是, 有时候你需要时间标签频繁事件时,获得更高的精度更能令人满意.举个例子,如果你要与线程打交道,或者

UVA 12105 - Bigger is Better(DP+高精度)

题目链接:12105 - Bigger is Better 题意:一些火柴,问你能组成整除m最大的数字是多少. 思路:dp[i][j]表示用i根火柴,组成%m余数为j的最大数字,末尾多一个数字k的状态就是dp[i + num[k]][(j * 10 + k) % m],由于最多可能50位数,所以要用高精度. 注意一个优化点,由于高精度的计算上只需要乘10+k,常规的高精度乘法复杂度还是有点高会超时,所以用数组去模拟,每次*10 + k的时候就往后多一位即可. 代码: #include <stdi

北京大学Online Judge 之 “求高精度幂(ID1001)”解题报告

北京大学Online Judge 之 "求高精度幂(ID1001)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目描述: Description 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要你解决的问题是:对一个实数R( 0.0 < R <99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <

【HNOI2004】【BZOJ1213】高精度开根

Description 晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得到一个无理数,所以这项工作是有较大难度的.现在要做的只是这项工作的第一步:只对自然数进行开整数次根,求出它的一个非负根,并且不考虑结果的小数部分,只要求把结果截断取整即可.程序需要根据给定的输入,包括需要开根的次数,以及被开根的整数:计算出它的非负根取整后的结果. Input 共有两行,每行都有一个

高精度小数

题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商,为了表达这样两个数的商,可以将相除的结果以多个整数来表示,每个整数表示结果的一位.即商的第一位用一个整数来表示,第二位用另一个整数来表示,以此类推,就可以输出一个高精度的除法结果了. 如16/19的结果0.8421052631...就可以依次输出8.4.2.1.0.5.2.6.3.1.... 而除法的过程,则可以模仿人工列竖式做