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

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

相关文章

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】

SpringMVC 实战小项目 3.1 加法计算器3.1.1 准备⼯作前端 3.1.2 约定前后端交互接⼝需求分析接⼝定义请求参数:响应数据: 3.1.3 服务器代码 3.2 ⽤⼾登录3.2.1 准备⼯作3.2.2 约定前后端交互接⼝3.2.3 实现服务器端代码 3.3 留⾔板实现服务器端代码 3.4 图书管理系统准备后端 3.1 加法计算器 需求: 输⼊两个整数, 点击"点

java编程:命令行输入的三个整数判断是否构成三角形,不能就抛异常。

写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出 异常IllegalArgumentException,显示异常信息“a,b,c不能构成三角形”, 如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。 附源代码: package 异常;public class Sa

输入一个整数,判断其是否是2^n,是就输出这个数,不是就输出和它最接近的为2^n的那个整数。

输入一个整数,判断其是否是2^n,若是,输出这 //个数,若不是,输出和它最接近的为2^n的那个整数。 附加源代码1: #include<stdio.h>#include<stdlib.h>#include<math.h>int main(){int input;//键盘输入一个整数inputint i,j;//i,j待会儿存放input与左边和右边的为2^n的差值int m

C语言编程:从键盘中输入一个数字,返回值为整数有效位数

//从键盘中输入一个数字(可以包含小数点,其位数在60位以下,求其整数的有效位数,如输入 //0123.456,返回值为整数有效位数为3) //1) 输入数据为浮点型,不用数组,不用字符串,只有变量的算术运算实现此功能。 #include<stdio.h>int main(){int weiShu = 0;//计算位数的变量初始化为0;float num;//控制台输入的数字in

一个整数使用英文表达的字母计数

题目: 把1到5写成英文单词分别是:one、two、three、four、five。这些单词一共用了3+3+5+4+4 = 19 个字母。 如果把1到1000都写成英文单词,一共要用多少个字母? 注:不计入空格和连字符,例如,342,three hundred and forty-two, 包含23哥字母,而115(one hundred and fifteen)包含20个字母。单词“and

Strassen矩阵乘法简要解析(第4章:分治策略)

Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下: 两个n×n 阶的矩阵A与B的乘积是另一个n×n 阶矩阵C,C可表示为假如每一个C(i, j) 都用此公式计算,则计算C所需要的操作次数为n3 m+n2 (n- 1) a,其中m表示一次乘法,a 表示一次加法或减法。 为了使讨论简便,假设n 是2的幂(也就是说, n是1,2,4,8,1 6,...)。 首先,假设

不使用判断比较符比较两个整数的大小(位运算)

在不使用判断操作符和比较操作符情况下判断两个整数的大小, 关于C# 的运算符可以查看官方说明: https://msdn.microsoft.com/zh-cn/library/xt18et0d(v=vs.80).aspx int Min(int a ,int b){int c =a-b;int sa=sign(a);int sb=sign(b);int sc=sign(

算法题--华为od机试考试(整数对最小和、素数之积、找城市)

目录 整数对最小和 题目描述 注意 输出描述 示例1 输入 输出 说明 解析 答案 素数之积 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入 输出 说明 解析 找城市 题目描述 输入 输出 示例1 输入 输出 示例2 输入 输出 说明 解析 答案 整数对最小和 考察排序,数组拍平 题目描述

【位操作笔记】计算整数的绝对值 3

计算整数的绝对值(integer absolute) 3 用于计算整数的绝对值,不使用分支判断。 算法说明 CPU表示有符号数的是使用补码(two’s complement),正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。 如果CPU表示有符号数使用的是反码(one’s complement),则该算法无效。 因为是使用补码(two’s complement),所以