大整数的加法、减法和乘法

2024-04-15 13:48
文章标签 整数 乘法 加法 减法

本文主要是介绍大整数的加法、减法和乘法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、大整数减法

整数的表示采用string, string的begin()为高位,end()为低位。做减法时,先判断两个数字的大小,调整为大数减小数,如果两个数字位数不同,则较小的数字前面补0。

最后要删除前边产生的0,并加上负号。

string BigSubtraction(string s1, string s2)
{string result;bool Flag = false;int carry = 0, len1, len2;if(s1 == s2){result = "0";return result;}else if(s1.size() < s2.size()){swap(s1, s2);len1 = s1.size();len2 = s2.size();for(int h = 0; h < len1 - len2; h++)s2.insert(s2.begin(), '0');Flag = true;}else{   //剩下的情形是s1.size()>=s2.size()//如果长度一样,但大小不宜样,调整位置if(s1.size() == s2.size() && s1 < s2){swap(s1, s2);Flag = true;}len1 = s1.size();len2 = s2.size();//如果s2本身九比s1断for(int h = 0; h < len1 - len2; h++)s2.insert(s2.begin(), '0');}for(int i=s1.size() - 1; i>=0; i--){if(carry + (s1[i] - '0') - (s2[i] - '0') < 0){carry = carry + 10 + (s1[i] - '0') - (s2[i] - '0');result.insert(result.begin(), carry + '0');carry = -1;}else{carry = carry + (s1[i] - '0') - (s2[i] - '0');result.insert(result.begin(), carry + '0');carry = 0;}}int f = 0;while(result[f] == '0'){result.erase(result.begin());}if(Flag == true)result.insert(result.begin(), '-');return result;
}
二、大整数加法

首先两个大整数通过补0对齐,然后再计算。最后加上进位。

string BigAdd(string s1, string s2)
{string c;int carry = 0;int len2 = s2.size() - 1;int len1 = s1.size() - 1;int max;if(len1 > len2){max = len1;for(int j = 0; j < len1 - len2; j++)s2.insert(s2.begin(), '0');}else{max = len2;for(int h = 0; h < len2 - len1; h++)s1.insert(s1.begin(), '0');}for(int i = s1.size()-1; i>=0; i--){carry += s1[i] - '0';carry += s2[i] - '0';c.insert(c.begin(), carry%10 + '0');carry /= 10;}if(carry>0)c.insert(c.begin(), carry%10 + '0');return c;
}

三、大整数乘法

string multiplication(string str1, string str2)
{int maxsize = 200;   //表示计算结果的长度int a[210], b[210], c[410];int i;for(i = 0; i<maxsize+10; i++)a[i] = b[i] = 0;for(i = 0; i < maxsize*2 + 10; i++)c[i] = 0;int len1, len2;len1 = str1.size();len2 = str2.size();int j;for(j=0, i=len1-1; i>=0; i--)a[j++] = str1[i] - '0';for(j=0, i=len2-1; i>=0; i--)b[j++] = str2[i] - '0';for(i = 0; i < len2; i++){for(j = 0; j < len1; j++)c[i+j] += b[i]*a[j];}//循环处理进位for(i = 0; i < maxsize*2; i++){if(c[i] >=10){c[i+1]+=c[i]/10;c[i]%=10;}}string Result = "";for(i = maxsize*2; (c[i]==0)&&(i>=0); i--);if(i>=0)for(; i>=0; i--)Result += c[i]+'0';elseResult = "0";return Result;
}


这篇关于大整数的加法、减法和乘法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905983

相关文章

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

高精度计算----减法运算(浮点型)

基于上一贴,修改减法运算适合于高精度浮点型计算。 因为减法比加法难度大一点,考虑的地方也要多一些,可能代码有欠缺,欢迎指出。 运算说明: 1、相减函数依旧没改变,包括上一贴的判断被减数与减数的大小函数也没变。 2、增加两个函数,取小数位数函数和结果处理(回归小数点)函数 3、与加法浮点高精度运算相比,这里改变较多的是结果处理函数,加法加完后,位数不减反增,而且最多增一位。减法会消失掉好多

高精度计算----减法运算

处理大数减法运算: 1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。 2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。 3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。 测试程序效果如下:   以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

【OpenCV2.2】图像的算术与位运算(图像的加法运算、图像的减法运算、图像的融合)、OpenCV的位运算(非操作、与运算、或和异或)

1 图像的算术运算 1.1 图像的加法运算 1.2 图像的减法运算 1.3 图像的融合 2 OpenCV的位运算 2.1 非操作 2.2 与运算 2.3 或和异或 1 图像的算术运算 1.1 图像的加法运算 add opencv使用add来执行图像的加法运算 图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的. # 图片加法imp

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),