当前位置: 首页 > news >正文

高精度加法,减法,乘法,除法(上)(C语言)

前言
加,减,乘,除这些运算我们自然信手捏来,就拿加法来说,我们要用c语言编程算a+b的和,只需让sum = a+b即可,可是这是局限的,我们都知道int的表示的最大值为2147483647(32位和64位机器)。但是如果我们要算的数超过了这个值该怎么办?这时会有人说:用long long不得了么?,但是你想想假如你面对的是几百位甚至几千位的整数时,用long long也无济于事,这时候就需要用到我们的高精度算法了。那么话不多说,让我们开始吧!
在这里插入图片描述

文章目录

  • 1,加法
  • 2,减法
  • 3,尾声

1,加法

首先让我们回忆回忆小学的时候我们时怎样进行加法用算的。
在这里插入图片描述
我们先把两个数弄成两行然后按位相加,如果某一位相加后大于9那么就往前进一位,下一位+1,这一位-10.
我们的高精度加法也是采用这个思路。
因为int 和long long不能够满足我们的高精度加法,那么我们只能另辟蹊径,我们知道数组可以很长,如果我们把需要相加的两个数字分别存进两个数组之中,数字的个位放在下标0,数字的十位放在下标1,…以此类推。到最后我们再把两个数组相同下标相加求和,如果大于9就往前进一位。相加完之后我们就能够得到我们的所需要求的和了。
但是怎么把数字的个位放在下标为0的地方呢?我们可以先创建一个char类型的数组,然后用%s进行读取,读取完之后将其内容翻转即可。(既然是字符数组那么就要留意‘1’不等于1,‘1’-‘0’=1)
读取完两个数字之后我们想把他们相加,可是他们的位数可能不一样,比如"10001"和"100",为了方便我们需要将短的字符串变长,在其前头补上’0’(即把"100"改成"00100")。
下面我用代码的方式给大家展示。

#include <stdio.h>
#include<string.h>void my_reverse(char* arr, int len)//简单的翻转函数{for (int i = 0; i < len - 1; i++, len--){char temp = arr[i];arr[i] = arr[len - 1];arr[len - 1] = temp;}}void print_sum(int len1, char* arr1, char* arr2){int q = 0;for (int i = 0; i < len1; i++){arr1[i] += arr2[i];// '1'+'1'-'0'='2'arr1[i] -= '0';if (arr1[i] > '9')//大于10往前进一位{arr1[i] -= 10;if (i != len1 - 1)arr1[i + 1] += 1;else//如果i=len1-1那么arr1[i]中存放的是'\0'需要+'1'来进一位{arr1[i + 1] += '1';q++;//长度+1,这里如果写len1++会导致循环失败}}}for (int i = len1 - 1 + q; i >= 0; i--)//倒序打印{printf("%c", arr1[i]);}}int main(){char arra[100] = { 0 }, arrb[100] = { 0 };//分别储存a,b的值scanf("%s %s", arra, arrb);int lena = strlen(arra);//计算a和b的长度int lenb = strlen(arrb);my_reverse(arra, lena);//将a和b进行翻转方便进行加法运算my_reverse(arrb, lenb);if (lena > lenb)//如果a的长度大于b的长度,在b后面补'0'方便计算{for (int i = lenb - 1; i < lena - 1; i++){arrb[i + 1] += '0';lenb++;}}else if (lena < lenb)//如果b的长度大于a的长度,在a后面补'0'方便计算{for (int i = lena - 1; i < lenb - 1; i++){arra[i + 1] += '0';lena++;}}print_sum(lena, arra, arrb);//相加并打印return 0;
}

我们自己写完之后,可以去洛谷 p1061题(A+B Problem(高精))进行自测。看看是否能通过。

2,减法

学会了高精度加法,自然高精度减法也不在话下。还是这种方法。
在这里插入图片描述
大致思路与加法相同,创建两个数组储存a和b,然后将两者相减即可,每一位小于0的话,前一位-1,这一位+10。
但是我们会发现,我们算a-b的时候如果b大于a会出现负数的情况,这会让我们不方便计算,那我们想一想,a-b是不是等于-(b-a)呢?如果b>a我们可以直接算b-a然后在结果的前面加上一个‘-’即可。
判定方法:如果字符串a的长度大于b的长度,那么不用多说a>b,反之b>a,但是当a=b的时候呢?我们回忆回忆我们之前是不是学过strcmp函数(链接:字符函数,字符串函数),通过这个函数我们可以按位比较ASCII值,通过这种函数我们就可以轻松判定当a和b长度相等时那个大那个小了(一定要在翻转前判定)。
下面我将用代码给大家展示。

#include <stdio.h>
#include<string.h>
void my_reverse(char* arr, int len)//简单的翻转函数
{for (int i = 0; i < len - 1; i++, len--){char temp = arr[i];arr[i] = arr[len - 1];arr[len - 1] = temp;}
}
void print_sub(int len, char* arr1, char* arr2)
{for (int i = 0; i < len; i++){if(arr2[i]!='\0')//如果该位置arr2[i]为\0则不需要减去'0'arr2[i] -= '0';arr1[i] -= arr2[i];if (arr1[i] < '0'){arr1[i + 1] -= 1;arr1[i] += 10;}}while (arr1[len - 1] == '0')//10001-10000的话会输出00001为了输出1我们要改变len的大小len--;for(int i = len-1;i>=0;i--)printf("%c", arr1[i]);if (len < 1)printf("0");//如果答案为0的时候len为0所以这是需要我们手动输入0
}int main(){char arra[10100] = { 0 }, arrb[10100] = { 0 };//分别储存a,b的值scanf("%s %s", arra, arrb);int lena = strlen(arra);//计算a和b的长度int lenb = strlen(arrb);if(lena == lenb)//我们的目的是让大的减去小的,所以要分情况讨论{if (strcmp(arra, arrb) >= 0){my_reverse(arra, lena);//将a和b进行翻转方便进行减法运算my_reverse(arrb, lenb);print_sub(lena, arra, arrb);return 0;}else// 如果b>a, a-b=-(b-a){printf("-");//打印个负号my_reverse(arra, lena);my_reverse(arrb, lenb);print_sub(lenb, arrb, arra);return 0;}    }my_reverse(arra, lena);my_reverse(arrb, lenb);if (lena > lenb){print_sub(lena, arra, arrb);}else if (lena < lenb)// 如果b>a, a-b=-(b-a){printf("-");//打印个负号print_sub(lenb, arrb, arra);}return 0;}

我们写完代码后可以去洛谷 p2142题(高精度减法)进行检测,看自己是否出现错误。

3,尾声

关于高精度乘法和高精度除法我们放到下一篇博客,如果觉得博主讲的不错,请一定要记得给博主点个关注,点个赞,最好再点个收藏(嘻嘻~)。那么我们下期再见吧!

相关文章:

高精度加法,减法,乘法,除法(上)(C语言)

前言 加&#xff0c;减&#xff0c;乘&#xff0c;除这些运算我们自然信手捏来&#xff0c;就拿加法来说&#xff0c;我们要用c语言编程算ab的和&#xff0c;只需让sum ab即可&#xff0c;可是这是局限的&#xff0c;我们都知道int的表示的最大值为2147483647&#xff08;32位…...

C++新经典模板与泛型编程:SFINAE特性的信息萃取

用成员函数重载实现is_default_constructible 首先介绍一个C标准库提供的可变参类模板std::is_default_constructible。这个类模板的主要功能是判断一个类的对象是否能被默认构造&#xff08;所谓默认构造&#xff0c;就是构造一个类对象时&#xff0c;不需要给该类的构造函数…...

java单人聊天

服务端 package 单人聊天;import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import…...

nodejs环境安装

node安装 wget https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/v20.8.0/node-v20.8.0-linux-x64.tar.gz tar xf node-v20.8.0-linux-x64.tar.xz -C /usr/local/ ln -s node-v20.8.0-linux-x64 nodevim /etc/profile.d/node.sh export PATH$PATH:/usr/local/node/binnp…...

R语言进行正态分布检验

查了很多资料&#xff0c;还是比较模糊 Kolmogorov-Smirnov检验&#xff08;K-S检验&#xff09;广泛用于正态性检验和其他分布的拟合检验。适用于中等到大样本。 Lilliefors检验是K-S检验的一种变体&#xff0c;专门为小样本设计。其通过使用更准确的临界值来提高对小样本的适…...

什么是SPA(Single Page Application)?它的优点和缺点是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

由于找不到xinput1_3.dll,无法继续执行代码的多种解决方法指南,xinput1_3.dll文件修复

当玩家或用户在启动某些游戏和应用程序时&#xff0c;可能会遭遇到一个系统错误提示&#xff1a;“由于找不到xinput1_3.dll,无法继续执行代码l”。这种情况通常指出系统中DirectX组件存在问题。以下我们将介绍几种常用的解决方法&#xff0c;并提供详细的操作步骤。 一.找不到…...

Vue---Echarts

项目需要用echarts来做数据展示&#xff0c;现记录vue3引入并使用echarts的过程。 1. 使用步骤 安装 ECharts&#xff1a;使用 npm 或 yarn 等包管理工具安装 ECharts。 npm install echarts 在 Vue 组件中引入 ECharts&#xff1a;在需要使用图表的 Vue 组件中&#xff0c;引入…...

uni-app实现返回刷新上一页

方案一 通过监听器实现 page1 uni.$on("refresh", function(data) {if(data.page "page2") {this.reload()} })page2 methods: {handleBack() {uni.$emit("refresh", {page: "page2"})uni.navigateBack()} }方案二 通过页面实例实…...

centos服务器安装docker和Rabbitmq

centos服务器 一 centos安装docker1 安装docker所需要的依赖包2配置yum源3查看仓库中所有的docker版本4安装docker5 设置docker为开机自启6验证docker是否安装成功 二 使用docker安装RabbitMQ拉取RabbitMQ镜像创建并运行容器 一 centos安装docker 1 安装docker所需要的依赖包 …...

【Redis】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

目录 Redis的慢查询 慢查询配置 慢查询操作命令 慢查询建议 Pipeline 事务 Redis的事务原理 Redis的watch命令 Pipeline和事务的区别 Lua Lua入门 安装Lua Lua基本语法 注释 标示符 关键词 全局变量 Lua中的数据类型 Lua 中的函数 Lua 变量 Lua中的控制语句…...

【pytorch】深度学习入门一:pytorch的安装与配置(Windows版)

请支持原创&#xff0c;认准DannisTang&#xff08;tangweixuan1995foxmail.com&#xff09; 文章目录 第〇章 阅读前提示第一章 准备工作第一节 Python下载第二节 Python安装第三节 Python配置第四节 Pycharm下载第五节 Pycharm安装第六节 CUDA的安装 第二章 Anaconda安装与配…...

安装postgresql驱动及python使用pyodbc指定postgresql驱动调用postgresql

注&#xff1a;Python解释器版本(32位/64位)和postgresql驱动版本(32位/64位)需一致。 一、安装postgresql驱动 https://www.postgresql.org/ftp/odbc/versions/msi/ &#xff08;1&#xff09;32位&#xff1a; &#xff08;2&#xff09;64位&#xff1a; 双击安装。全程默…...

【OpenCV】计算机视觉图像处理基础知识

目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Ca…...

Course1-Week3-分类问题

Course1-Week3-分类问题 文章目录 Course1-Week3-分类问题1. 逻辑回归1.1 线性回归不适用于分类问题1.2 逻辑回归模型1.3 决策边界 2. 逻辑回归的代价函数3. 实现梯度下降4. 过拟合与正则化4.1 线性回归和逻辑回归中的过拟合4.2 解决过拟合的三种方法4.3 正则化4.4 用于线性回归…...

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像&#xff0c;因为它受到严格控制&#xff0c;体积小&#xff08;目前不到6 MB&#xff09;&#xff0c;同时仍然是一个完整的Linux发行版。 FR…...

Drools 入门:折扣案例

1. 安装 在idea软件中安装Drools 插件&#xff0c;我这里是直接搜索Drools就可以搜到 2. 实现入门案例 2.1 配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…...

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个&#xff1a; onLaunch(options)&#xff1a;当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;。onShow(options)&#xff1a;当小程序启动或从后台进入前台显示时&#xff0c;会触发 on…...

“无忧文件安全!上海迅软DSE文件加密软件助您轻松管控分公司数据!

许多大型企业集团由于旗下有着分布在不同城市的分支机构&#xff0c;因此在规划数据安全解决方案时&#xff0c;不适合采用市面上常见的集中式部署方式来管控各分部服务器&#xff0c;而迅软DSE文件加密软件支持采用分布式部署的方式来解决这一问题。 企业用户只需在总部内部署…...

详解线段树

前段时间写过一篇关于树状数组的博客树状数组&#xff0c;今天我们要介绍的是线段树&#xff0c;线段树比树状数组中的应用场景更加的广泛。这些问题也是在leetcode 11月的每日一题频繁遇到的问题&#xff0c;实际上线段树就和红黑树 、堆一样是一类模板&#xff0c;但是标准库…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...