高精度|大数加减乘

2024-06-09 19:52
文章标签 大数 加减 高精度

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

一、大数加法

1.反转法 (不开动态数组存)

#include<bits/stdc++.h>
using namespace std;
string add(string s1,string s2){if(s1.length() < s2.length() ) swap(s1,s2);reverse(s1.begin(),s1.end());reverse(s2.begin(),s2.end());int carry = 0;for(int i = 0 ; i < s2.length() ; i++){int sum = (s1[i] - '0') + (s2[i] - '0') + carry;s1[i] = sum%10 + '0';carry = sum / 10;}for(int i = s2.length() ; i < s1.length() ; i++){int sum = s1[i]-'0' + carry;s1[i] = sum % 10 + '0';carry = sum /10;}if(carry) {s1.push_back(carry + '0');}reverse(s1.begin() , s1.end());return s1.empty() ? 0 : s1;
}
int main(){string num1,num2;cin>>num1>>num2;string num = add(num1,num2);cout<<num<<endl;
}

2.开数组存

#include<bits/stdc++.h>
using namespace std;
string add(string s1,string s2){int len1 = s1.length() - 1;int len2 = s2.length() - 1;int carry = 0;string result;//动态数组保存答案 vector<char> result;while(len1 >=0 || len2 >=0 ){int n1 = len1 >=0 ? (s1[len1--] - '0') : 0;//大端方式(从个位计算) int n2 = len2 >=0 ? (s2[len2--] - '0') : 0; int sum = n1 + n2 + carry;carry = sum /10;result.push_back(sum%10+'0');}//始终对进位要处理 if(carry > 0 ){result.push_back(carry + '0');}reverse(result.begin(),result.end());//调用vector数组即能够反转,也能转化为字符串 //string r1(result.rbegin() , result.rend());return r1;	
}
int main(){string num1,num2;cin>>num1>>num2;string num = add(num1,num2);cout<<num<<endl;
}

二、大数减法

加负号 + 交换两数

1.数字1.length() < 数字2.length();
2.两数字长度相同,但数字1 < 数字2

#include<bits/stdc++.h>
using namespace std;string subtract(string num1,string num2){if(num1.size() < num2.size() || (num1.size() == num2.size() && num1 < num2)){return "-" + subtract(num2,num1);//交换两个数并返回负数形式。 }string result = " ";int len1 = num1.size()-1;int len2 = num2.size()-1;int borrow = 0;//计算 while(len1 >= 0 || len2 >= 0){int n1 =len1 >= 0 ? num1[len1--]-'0':0;int n2 = len2 >= 0 ? num2[len2--]-'0':0;int sub = n1 - n2 - borrow;//个位减法后观察是否借位 if(sub<0){sub+= 10;borrow = 1;}else borrow = 0;//将结果保存 result.push_back(sub+'0');} //去除前导零 while(result.size() >1 && result.back() =='0') result.pop_back();//反转 reverse(result.begin(),result.end());return result;
}
int main(){string num1,num2;cin>>num1>>num2;string num = subtract(num1,num2);cout<<num<<endl;
}

总结:

大数加减法主要使用借位和进位的方式,并且都可以采用string进行存储,随后反转结果,只不过减法,1. 交换两数 + 要加负号,2.要对多余的前导零(直接丢掉)pop_back()

三、大数乘法

两种思路在for循环不同,第一个好理解也好模拟,但是注意加法的位置**(错位相加)**

#include<bits/stdc++.h>
#define N 1001
using namespace std;
string multiply(string num1,string num2){if(num1 == "0" || num2 == "0") return "0";reverse(num1.begin(), num1.end());reverse(num2.begin(),num2.end());int len1 = num1.size();int len2 = num2.size();vector<int> result(len1 + len2,0);for (int i = 0; i < len1; ++i) {for (int j = 0; j < len2; ++j) {//重点:之前的本位 + 该位结果 = 现在本位result[i + j] += (num1[i] - '0') * (num2[j] - '0'); // 直接累加到结果的相应位置//求进位result[i + j + 1] += result[i + j] / 10; // 处理进位//更新本位result[i + j] %= 10; // 更新当前位的值}}string strResult;for(int i = result.size() - 1 ; i >= 0 ;--i){//去除前导零 if(strResult.empty() && result[i] == 0) continue;strResult.push_back(result[i] +'0');}return strResult.empty() ? "0": strResult;
}
int main(){string num1,num2;cin>>num1>>num2;string result = multiply(num1,num2);cout<<result<<endl;
}
#include<bits/stdc++.h>
using namespace std;string subtract(string num1,string num2){int len1 = num1.size();int len2 = num2.size();vector<int> result(len1+len2,0);//这个不好理解啊for(int i = len1-1;i>=0;i--){for(int j =len2-1 ; j>=0 ;j--){int mul = (num1[i] - '0') * (num2[j] -'0');int sum = result[i+j+1] + mul;result[i+j+1] = sum%10;//保存个位数 result[i+j] += sum /10;//进位 }}string strResult;//忽略前导零存数字 for(int digit : result){if(!(strResult.empty() && digit == 0)){strResult.push_back(digit + '0');}} return strResult.empty() ? "0":strResult;
}int main(){string num1,num2;cin>>num1>>num2;string num = subtract(num1,num2);cout<<num<<endl;
}

总结

大数乘法注意1. 使用动态数组存
2.去除前导零(遍历去除)

当然洛谷里面的这个题解看起来更简单易懂

四、大数除法

结合加法减法乘法进行操作,比较复杂

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



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

相关文章

iOS7和iOS6适配,和保留之前的坐标编码习惯,不用刻意加减

//目的:用于iOS7和iOS6适配,和保留之前的坐标编码习惯,不用刻意加减/*方法1:*1。在vc中重写viewDidLayoutSubviews方法*2。是用下面2个方法之一;*3。frame为ios6风格,状态栏和导航栏为平铺*4。bounds为ios7风格,状态栏和导航栏为覆盖*5。优点,所有subview的坐标都一ios6的标准进行编写,支持push和present*6。缺点,在push

[leetcode] 43. Multiply Strings(大数相乘)

Multiply Strings 描述 Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2. Note: 1. The length of both num1 and num2 is < 110. 2. Both num1 an

【C++实验】多项式加减

题目:一元多项式运算 基本要求:     (1) 输入并建立多项式;     (2) 输出多项式;     (3) 多项式加法     (4) 多项式减法。 测试数据:  代码展示: #include<iostream>using namespace std;class LinkedNode{public:LinkedNode(double COEF, doub

不到3毛钱的SOT23和SOT89封装18V耐压低功耗高PSRR高精度LDO稳压芯片ME6231电流0.5A电压3.3V和1.8V

前言 SOT23-5封装ME6231外观和丝印 一款国产LDO,某些场合,要把1117扔了吧,SOT23封装,虽然不是最小,但也是够小的了。 参考价格:约0.25元 概述 ME6231 系列是以 CMOS 工艺制造的 18V 耐压、低功耗、高 PSRR,高精度低压差线性稳压器。ME6231系列稳压器内置固定电压基准,温度保护,限流电路,相位补偿电路以及低内阻的 MOSFET,达到高

再来一种求大数阶乘的方法

过多的我就不说了,直接看看代码: java版的: /*** */package Factorial;/*** @author 牟尼(昵称)* @blog:http://blog.csdn.net/u012027907**/public class Factorial {/** 大数阶乘计算类*//** 分析:大数阶乘用数组来存储,如5的阶乘可存在数组cal[]中,表示为* 0

LabVIEW与3D相机开发高精度表面检测系统

使用LabVIEW与3D相机开发一个高精度表面检测系统。该系统能够实时获取三维图像,进行精细的表面分析,广泛应用于工业质量控制、自动化检测和科学研究等领域。通过真实案例,展示开发过程中的关键步骤、挑战及解决方案,确保系统的高性能和可靠性。 随着工业自动化和智能制造的发展,精密表面检测在质量控制中的重要性日益凸显。3D相机因其能够获取高精度的三维图像,在表面检测中具有独特优势。本文将介绍如

用于测试高精度恒流源电路

目前音圈马达在测试方面并没有专用的工具,只有常规的驱动芯片,针对这一问题设计一种高精度恒流源电路,能够对音圈马达的行程、线性度、磁滞、斜率等参数进行测试,和对音圈马达进行寿命实验。        系统主要包括微处理器、D/A转换、A/D转换、运放恒流电路、显示输出、按键输入、储存电路、通讯电路以及电源电路。 此电路能实现-200mA~200mA高精度电流输出,系统设计电流输出步进

HDU 1316 大数二分

建素数表  二分查找  练手用了。。 #include "stdio.h"#include "string.h"int f[5010][1010];int pk(int a[],int b[]){int i;if (a[0]>b[0]) return 1;if (a[0]<b[0]) return -1;for (i=a[0];i>=1;i--){if (a[i]>b[i]) retu

POJ 1001 大数

无聊水一道。。大数模拟 各种坑爹测试数据 #include "stdio.h"#include "string.h"int a[10010],b[10010],c[10010];int main(){int w,i,j,m,dian,k,le;char str[1001];while (scanf("%s%d",&str,&w)!=EOF){getchar();if (w==0){

HDU 4927 大数

题意很简单: 对于长度为n的数,做n-1遍,生成的新数列:  b1=a2-a1   b2=a3-a2  b3=a4-a3 c1=b2-b1   c2=b3-b2 ans=c2-c1 最后推出公式:  为n所在行的杨辉三角 对于样例: 3 1 2 3 ans=1*1-2*2+1*3=0 4 1 5 7 2 ans=-1*1+3*5-3*7+1*2=-5 求杨辉三角每个数的时