高精度|大数加减乘

一、大数加法

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.mzph.cn/diannao/25543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux RedHat7.6操作系统的xfs格式化后,mount不生效

Linux RedHat7.6操作系统的xfs格式化后,mount不生效 问题现象 最近在准备测试环境的过程中&#xff0c;当对xfs文件系统格式化后,mount磁盘&#xff0c;通过df -h命令查看&#xff0c;未显示挂载磁盘信息 [rootZHZXLxjspo0db003 ~]# mount /dev/datavg/datavg-lv_data /data…

vue2中如何动态渲染组件

vue2中如何动态渲染组件 动态渲染组件代码解读通过函数调用渲染组件 封装一个函数调用的二次确认弹窗如何让外部知道用户点击了取消还是确定呢&#xff1f; 思考小结 vue2 的项目中&#xff0c;main.js 文件中有一个挂载 App.vue 组件的方法&#xff1a; new Vue({name: Root,…

工程师 - 什么是EMI测试

一、EMC EMI EMS定义&#xff1a; EMC&#xff08;ElectromagneticCompatibility&#xff09; 电磁兼容&#xff0c;是指设备或系统在电磁环境中性能不降级的状态。电磁兼容&#xff0c;一方面要求系统内没有严重的干扰源&#xff0c;一方面要求设备或系统自身有较好的抗电磁…

5G发牌五周年丨移远通信:全面发力,加快推进5G技术服务社会发展

2024年6月6日&#xff0c;正值中国5G商用牌照发牌五周年。根据移动通信“十年一代”的规律&#xff0c;5G已走过一半征程。在过去的五年时间里&#xff0c;5G技术从萌芽到成熟&#xff0c;深刻改变了工业、农业、医疗及消费端等各个领域的发展脉络。无论是无人机配送、自动驾驶…

5_1 Linux 计划任务

5_1 Linux 计划任务 文章目录 5_1 Linux 计划任务[toc]1. crontab 命令2. 计划任务书写格式 用途&#xff1a;按照设置的时间间隔&#xff0c;为用户反复执行某一固定的系统任务 软件包&#xff1a;cronie、crontabs 系统服务&#xff1a;crond 日志文件&#xff1a;/var/log/c…

【LeetCode】两数相加(基于单向链表)难度:中等

目录 理清题目 解题思路 题目代码 运行结果 我们来看一下题目描述&#xff1a; 理清题目 首先题目要求链表中的节点的值必须在[0,9]之间也就是说我们要处理的数字必为正整数&#xff0c;因此就不会涉及到太复杂的计算&#xff0c;题目其实就是要求对两个链表中的节点的值分…

详解 Flink 的状态管理

一、Flink 状态介绍 1. 流处理的无状态和有状态 无状态的流处理&#xff1a;根据每一次当前输入的数据直接转换输出结果的过程&#xff0c;在处理中只需要观察每个输入的独立事件。例如&#xff0c; 将一个字符串类型的数据拆分开作为元组输出或将每个输入的数值加 1 后输出。…

Set up a WordPress blog with Nginx

CentOS7 配置Nginx域名HTTPS Here is the revised guideline for setting up a WordPress blog with Nginx: Step 1: Install Nginx, MySQL, and PHP (LEMP Stack) Install Nginx: sudo yum install nginx sudo systemctl start nginx sudo systemctl enable nginxInstall MyS…

Java_字符串、字符与数字之间的相互转换

一、数字转字符串 //将整个数字转化为字符串int i456;//方法一 String str1 Integer.toString(i);System.out.println(str1);//方法二String str2i"";System.out.println(str2);二、字符串转数字 //整数方法一String str"123";int num1Integer.parseInt(st…

Vue3路由跳转并传递参数

文章目录 1. 前言2. 准备工作2.1 编写路由规则2.2 源页面2.3 目标页面 3. 源页面如何传递参数给目标页面3.1 通过 router-link 标签传递参数&#xff08;很少使用&#xff09;3.2 通过 js 代码传递参数&#xff08;经常使用&#xff09; 4. 目标页面接收源页面传递过来的参数5.…

台积电代工!Intel新AI PC芯片Lunar Lake发布:AI算力120TOPS!

根据英特尔披露的数据显示&#xff0c;Lunar Lake的GPU性能提升50%、NPU内核的AI算力增加了四倍、SoC耗电量减少40%、GPU AI算力增加3.5倍&#xff0c;整个SoC的算力超过了120TOPS。 6月4日&#xff0c;英特尔CEO帕特基辛格在COMPUTEX 2024上发表主题演讲&#xff0c;正式公布…

在 React 应用中,怎么封装一个路由权限

在React应用中,封装一个路由权限控制通常涉及到几个关键步骤。这通常涉及到React Router(特别是React Router v5或v6)和自定义的权限检查逻辑。以下是一个基本的步骤指南,以及如何使用React Hooks(如useEffect和useState)来封装路由权限: 定义权限检查逻辑: 首先,你需…

如何确保redis缓存中的数据与数据库一致

一、双写模式&#xff1a; 在写入数据库时&#xff0c;也写入缓存。 二&#xff1a;失效模式&#xff1a; 在写入新数据后&#xff0c;删除缓存中数据&#xff0c;下次请求时查询数据库&#xff0c;并把查到的最新数据写入缓存。 不管是双写模式还是失效模式&#xff0c;缓…

Letcode-Top 100二叉树专题

94. 二叉树的中序遍历 方法一&#xff1a;递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

SpringBoot的学习要点

目录 SpringBoot 创建项目 配置文件 注解 命名规范 SpringBoot整合第三方技术 …… 中文文档&#xff1a;Spring Boot 中文文档 SpringBoot Spring Boot 是基于 Spring 框架的一种快速构建微服务应用的方式它主要提供了自动配置、简化配置、运行时应用监控等功能它…

大水文之------端午练练JS好了

最近有点不太知道要干啥了&#xff0c;昨天看了集cocos的介绍&#xff0c;下载了个DashBoard&#xff0c;看了看里面的内容&#xff0c;确实有点小震惊&#xff0c;还有些免费的源码可以学习&#xff0c;挺好的。 昨天学习ts&#xff0c;感觉自己的js水平好像不太行&#xff0c…

Functional ALV系列 (10) - 将填充FieldCatalog封装成函数

在前面的博文中&#xff0c;已经讲了封装的思路和实现&#xff0c;主要是利用 cl_salv_data_descr>read_structdescr () 方法来实现。在这里&#xff0c;贴出代码方便大家参考。 编写获取内表组件的通用方法 form frm_get_fields using pt_data type any tablechanging…

排序---基数排序

前言 个人小记 一、简介 基数排序是一种非比较排序&#xff0c;所以排序速度较快&#xff0c;当为32位int整数排序时&#xff0c;可以将数分为个位十位分别为2^16,使得拷贝只需要两轮&#xff0c;从而达到2*n&#xff0c;然后给一个偏移量&#xff0c;使得可以对负数排序。以…

C++期末复习提纲(血小板)

目录 1.this指针 2.静态成员变量 3.面向对象程序设计第一阶段 4.面向对象程序设计第二阶段 5.面向对象程序设计第三阶段 6.简答题 &#xff08;1&#xff09;拷贝构造函数执行的三种情况&#xff1a; &#xff08;2&#xff09;虚析构函数的作用&#xff1a; &#xff…

55.ReentrantReadWriteLock应用于缓存

简单的缓存案例 模拟一个数据层dao @Slf4j public class GenericDao {public <T> T queryOne(Class<T> beanClass, String sql, Object... args) {try {log.debug("进入数据库查询.....");Constructor<T> constructor = beanClass.getDeclaredCo…