当前位置: 首页 > 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;但是标准库…...

面试题详解:检索链路设计全攻略——RAG 检索架构、查询理解、多路召回、混合检索、Rerank、上下文构造与评估闭环

1. 为什么说检索链路设计&#xff0c;是 RAG 项目的“生命线”&#xff1f;1.1 大模型回答质量&#xff0c;很多时候不是模型决定的&#xff0c;而是证据决定的在 RAG 系统里&#xff0c;大模型像一个会组织语言的“回答器”&#xff0c;但它能不能答准&#xff0c;取决于它面前…...

解决Matlab硬件支持包安装失败:手把手教你手动部署Autosar工具链

解决Matlab硬件支持包安装失败&#xff1a;手把手教你手动部署Autosar工具链 当你在Matlab Add-On管理器中反复尝试安装Autosar支持包却遭遇网络超时、许可证报错或进度条卡死时&#xff0c;手动部署方案往往能成为突破困境的终极手段。不同于常规的图形化安装流程&#xff0c…...

HS2-HF_Patch:Honey Select 2汉化补丁终极指南与完整功能解析

HS2-HF_Patch&#xff1a;Honey Select 2汉化补丁终极指南与完整功能解析 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是Honey Select 2游戏的一…...

Next.js 14全栈样板工程解析:集成Prisma与NextAuth的现代Web开发实践

1. 项目概述&#xff1a;一个为现代Web应用量身定制的启动器如果你正在寻找一个能让你跳过繁琐的初始化配置&#xff0c;直接进入核心业务逻辑开发的Next.js项目起点&#xff0c;那么nemanjam/nextjs-prisma-boilerplate这个项目很可能就是你需要的。这不是一个简单的“Hello W…...

Ansys Mechanical|远程点Behavior设置:刚性与柔性选择背后的工程考量

1. 远程点Behavior设置的核心逻辑 在Ansys Mechanical中&#xff0c;远程点&#xff08;Remote Point&#xff09;的Behavior设置看似只是一个简单的下拉选项&#xff0c;实则直接影响整个仿真结果的准确性。我见过太多工程师在这里踩坑&#xff0c;包括我自己早期也犯过错误。…...

AI Agent Skill 从入门到精通:定义、结构、调用链路与底层原理

一篇帮你从"知道 Skill 这个词"到"能独立设计生产级 Skill"的系统教学&#xff0c;含 3 个完整实战案例。阅读提示适合谁看&#xff1a;正在做或准备做 AI Agent 开发的工程师&#xff0c;尤其是从传统后端 / 数据仓库转过来的同学看完能做什么&#xff1a…...

紧急通告:OpenAI已于2024年6月1日灰度上线ChatGPT Pay API V2.1,当前仅向Stripe白名单商户开放(附申请通道+审核时效倒计时)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT实时支付功能在哪里 ChatGPT 本身并不原生支持实时支付功能。OpenAI 官方发布的 ChatGPT&#xff08;包括免费版、Plus 订阅版及 Team/Enterprise 版&#xff09;定位为人工智能对话助手&#xff0c;…...

手把手教你用C#和NetToPLCSim连接西门子S7-1200仿真PLC(含虚拟网卡配置避坑)

从零实现C#与西门子S7-1200仿真PLC通信全指南 当第一次尝试用C#与西门子PLC建立通信时&#xff0c;我盯着屏幕上反复出现的连接失败提示&#xff0c;深刻理解了什么是"工控开发入门劝退三连"——IP配置玄学、端口占用谜团、虚拟网卡黑洞。本文将用真实踩坑经验&…...

Google发现的神级Prompt工程新技巧:重复Prompt提升效果

Google发现的神级Prompt工程新技巧&#xff1a;重复Prompt提升效果 关键词&#xff1a;Prompt工程、提示词优化、LLM技巧、GPT技巧、AI提问技巧、Prompt Repetition、提示词工程一、最近发现一个被低估的Prompt技巧 pdf地址 https://arxiv.org/pdf/2512.14982最近在看一篇 Goog…...

XHS-Downloader终极指南:如何高效批量下载小红书内容

XHS-Downloader终极指南&#xff1a;如何高效批量下载小红书内容 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接&…...