用C++实现高精度加法运算

先说说高精度运算的概念:

是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个200位的数的和。这时,就要用到高精度算法了。(摘自百度百科)。

再往下看之前,大家先列竖式计算35+86。

注意的问题:

(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;

(2)运算规则:同一位的两个数相加,然后再加上从低位来的进位,成为该位的和;

这个和再去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;

可借助MOD、DIV运算完成这一步;

(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;

(4)如果两个加数位数不一样多,则按位数多的一个进行计算;

基本思路:

1. 先将从键盘输入的两个数分别存入两个char型的字符数组,然后再将两个char数组的数据转存入两个int型的数组。

这一功能的代码如下:

[cpp] view
plain
 copy

print?

  1. for (i=0;i<=a1_len-1;i++)
  2. {
  3. a[a1_len-i]=a1[i]-48; //将操作数放入a数组  
  4. }
  5. for (i=0;i<=b1_len-1;i++)
  6. {
  7. b[b1_len-i]=b1[i]-48; //将操作数放入b数组
  8. }

数字存入char型数组,要存入int型数组,需要减去48,可以查看ascii码表。道理如同大写字母变小写字符需要加32是一样的。

2. 从两个int数组的地位开始执行操作,地位相加,注意进位。这一功能的代码如下:

[cpp] view
plain
 copy

print?

  1. while(lenc <=a1_len || lenc <=b1_len)
  2. {
  3. c[lenc]=a[lenc]+b[lenc]+x; //两数相加  
  4. x=c[lenc]/10;   //要进的位
  5. c[lenc]=c[lenc]%10;     //进位后的数
  6. lenc++;     //数组下标加1
  7. }

3. 最后一步的时候要判断是否有进位,如果有进位,注意下标的变化,将最后一个进位存储进去;如果没有进位,则完成运算。

下面是用C++实现高精度加法的完整代码,代码的变化性很大,可以根据自己的想法做修改的。

源代码如下:

[cpp] view
plain
 copy

print?

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int main()
  6. {
  7. char a1[100],b1[100];
  8. int a[100],b[100],c[100];
  9. int a1_len,b1_len,lenc,i,x;
  10. memset(a,0,sizeof(a));
  11. memset(b,0,sizeof(b));
  12. memset(c,0,sizeof(c));
  13. gets(a1);
  14. gets(b1); //输入加数与被加数
  15. a1_len=strlen(a1);
  16. b1_len=strlen(b1);
  17. for (i=0;i<=a1_len-1;i++)
  18. {
  19. a[a1_len-i]=a1[i]-48; //将操作数放入a数组  
  20. }
  21. for (i=0;i<=b1_len-1;i++)
  22. {
  23. b[b1_len-i]=b1[i]-48; //将操作数放入b数组
  24. }
  25. lenc =1;
  26. x=0;
  27. while(lenc <=a1_len || lenc <=b1_len)
  28. {
  29. c[lenc]=a[lenc]+b[lenc]+x; //两数相加  
  30. x=c[lenc]/10;   //要进的位
  31. c[lenc]=c[lenc]%10;     //进位后的数
  32. lenc++;     //数组下标加1
  33. }
  34. c[lenc]=x;
  35. if (c[lenc]==0)
  36. {
  37. lenc--; //处理最高进位
  38. }
  39. for (i=lenc;i>=1;i--)
  40. {
  41. cout<<c[i]; //输出结果
  42. }
  43. cout<<endl;
  44. return 0;
  45. }

下面是在VC里面的运行样例:

注:如果没有看懂程序的朋友,建议在VC里面打断点,单步调试一下,可以很清楚的看见数组的每一个下标元素的变化,对于理解此程序很有帮助。

有图为证。

时间: 2024-08-27 14:50:38

用C++实现高精度加法运算的相关文章

使用C++的string实现高精度加法运算

对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为string,设为s1和s2. 接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算). string reverseStr(string input){ string output = ""; for(int i = 0; i < input.length(); i++){

高精度计算(二) /*高精度的加法运算*/

例 高精度加法运算 输入正整数 a 和 b,输出 a+b 的值.0<a,b<=10^250 输入: 第一行:a 第二行:b   输出:a+b 的和. 样例输入: 99    999 样例输出: 1098 分析: (1)加法运算      -- a[7]  a[6]  a[5]  a[4]  a[3]  a[2]  a[1] -+-   0      0    b[5]  b[4]  b[3]  b[2]  b[1] ----------------------------------    

问题 B: 【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 94  解决: 27[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

1.高精度加法.减法.乘法 #include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char

中石油-【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 63  解决: 20[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

高精度浮点数运算

/* Name: 高精度浮点数运算 Copyright: Author: 巧若拙 Date: 08-11-14 10:17 Description: 本程序实现了高精度浮点数的加法,减法,乘法,乘方和除法运算,有效数字精确到MAX. 为了便于进位,本程序采用了较为独特的数据结构,即把浮点数分成整数和小数部分,分别存储在两个不同的数组中. 其中整数部分数字存储在ValInt[MAX-lenInt...MAX) ,小数部分数字存储在ValDec[1...lenDec],ValDec[0]用来存储进位

用c++实现高精度加法

c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以字符数组的形式输入,建立字符数组,建立相应的整数数组,然后一一映射,以此来实现数据的输入,需要注意的是,当实现字符向数字映射时,应该减去相应的ASCII偏移值,即48. 2:为了模拟我们在纸上手算的进位模拟运算,我们将字符数组反向填入整数数组,上图的后几行代码实现了这个操作. 3:实现进位加法,这是

POJ 3181 Dollar Dayz(完全背包+简单高精度加法)

POJ 3181 Dollar Dayz(完全背包+简单高精度加法) http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币分别是1美元,2美元-K美元且可以无限使用,问你用上面K种硬币构成n美元的话有多少种方法? 分析: 本题是一道明显的完全背包问题, 不过本题还可以换一种方法来看: 整数n由前K个自然数构造, 一共有多少种方法? (虽然本题要用到高精度加法, 但是很简单, 不要被吓到哦) 首先是DP部分: 令dp[i][j]==x 表示由前i种硬币构成j

高精度的运算的NumberUtils

package com.zjt.frame; import java.math.BigDecimal; import org.apache.commons.lang3.StringUtils; /** * * 功能说明: 提供高精度的运算支持. 所以函数以double为参数类型,兼容int与float. * * @author admin */public class NumberUtils { private NumberUtils() { } /** * 精确的加法运算. * * @para