C语言——高精度减法

相较于高精度加法,高精度减法会有一些不同,如果是num1 - num2的话,如果num1 > num2时,也就是结果为正时,只需要对每一位进行按位相减,如果不够就向下一位借位;但是如果是num1 < num2时,即结果为负时,再按上方的算法就会得到错误的结果,我们可以转换一下,num1- num2 < 0,那么num2 - num1 > 0,而且num1 - num2 = - (num2 - num1),所以在结果为负时,我么可以将减数互换,是结果为正,然后再结果前面加一个负号。

代码实现:

#include <stdio.h>
#include <string.h>void DigitReverse(char arr[])//反转字符串,以便后续计算
{int length = (int)strlen(arr);for (int i = 0; i < length / 2; i++){int temp = arr[i];arr[i] = arr[length - i - 1];arr[length - i - 1] = temp;}
}void StringTranstoNumber(char arrchar[],int arrnum[])//将字符数组转换为数字数组
{int length = (int)strlen(arrchar);for (int i = 0; i < length; i++){arrnum[i] = arrchar[i] - '0';}
}int JudgeResPorN(char arrch1[], char arrch2[],int len1,int len2)//1代表结果为负,0代表结果为正
{if (len1 > len2)//数字一位数大,则结果为正{return 0;}else if(len1 == len2)//两数字位数相等,遍历数字的每一位{for (int i = 0; i < len1; i++){if (arrch1[i] == arrch2[i])//i位上的数字相等,就继续判断后面的数位上的数字{continue;}else if(arrch1[i] > arrch2[i])//数字一的i位数字大于数字二的,则为正{return 0;}else//数字二的i位数字大于数字一的,则为正{return 1;}}}else//len1 < len2时结果为负{return 1;}
}void Calculate(int num1[], int num2[],int numsub[],int length)//计算减法部分
{int borrow = 0;//borrow为借位,只能是0或-1for (int i = 0;i < length; i++){numsub[i] = num1[i] - num2[i] + borrow;//i位的结果是两数字i位相减然后加上i - 1位的借位,这里是加0或-1if (numsub[i] < 0)//只要i位是负的,则要向i + 1位借位{borrow = -1;//借位numsub[i] = numsub[i] + 10;//借位借一作十,这一位的最终结果是十加原来的负数}else//i位是正的,就不用借位{borrow = 0;}}
}void Print(int numres[],int length)//打印部分
{int i = length + 1;while (i > 0 && numres[i] == 0)//去掉前导0{i--;}for (; i >= 0; i--){printf("%d",numres[i]);}
}void BigNumSub(char arrch1[],char arrch2[],int arrsub[])
{int len1 = (int)strlen(arrch1);int len2 = (int)strlen(arrch2);int length = len1 > len2 ? len1 : len2;int c = JudgeResPorN(arrch1, arrch2, len1, len2);//在字符串反转之前就要判断结果的正负DigitReverse(arrch1);DigitReverse(arrch2);int num1[505] = { 0 };int num2[505] = { 0 };StringTranstoNumber(arrch1,num1);StringTranstoNumber(arrch2,num2);if (c == 1)//结果为负{Calculate(num2,num1,arrsub,length);//结果为负就互换num1和num2,这样结果为正printf("-");//结果转为正后在结果前面加一个负号Print(arrsub,length);//打印结果}else//结果为正{Calculate(num1,num2,arrsub,length);//结果为正就正常计算Print(arrsub, length);//打印结果}
}int main()
{char ch1[505] = "0";char ch2[505] = "0";scanf("%s",ch1);//ch1 - ch2scanf("%s",ch2);int res[505] = {0};BigNumSub(ch1,ch2,res);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225875.shtml

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

相关文章

【算法与数据结构】53、LeetCode最大子数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;程序一共两个变量&#xff0c;一个result一个count。result用来记录最终的结果&#xff0c;count记录当…

LAMP平台——构建PHP运行环境

在构建LAMP平台时&#xff0c;各组件的安装顺序依次为Linux、Apache、MySQL、PHP。其中Apache和 MySQL的安装并没有严格的顺序&#xff1b;而PHP环境的安装一般放到最后&#xff0c;负责沟通Web服务器和数据库 系统以协同工作。 PHP 即 Hypertext Preprocessor&#xff08;超级…

数据结构 之map/set练习

文章目录 1. 只出现一次的数字算法原理&#xff1a;代码&#xff1a; 2. 随机链表的复制算法原理&#xff1a;代码&#xff1a; 3. 宝石与石头算法原理&#xff1a;代码&#xff1a; 4. 坏键盘打字算法原理&#xff1a;代码&#xff1a; 5. 前K个高频单词算法原理&#xff1a;代…

图片的批量建码怎么做?一图一码的制作方法

在使用图片展示内容时&#xff0c;经常会有同一类型的图片信息是有区别的&#xff0c;如果需要将每张图片批量生成二维码图片&#xff0c;那么出了一张一张去制作之外&#xff0c;有没有能够一键批量建码的功能可以解决这个问题呢&#xff1f;下面来给大家分享一下图片批量建码…

SpringBoot 源码解析1:环境搭建

SpringBoot 源码解析1&#xff1a;环境搭建 1.项目结构2.pom.xml3.MyApplication 1.项目结构 最简单的spring-web项目 2.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

2023 年安徽省职业院校技能大赛信息安全管理与评估项目竞赛须知

2023 年安徽省职业院校技能大赛&#xff08;高职组&#xff09; “信息安全管理与评估”项目竞赛须知 一、参赛队须知 1.参赛队名称&#xff1a;统一使用规定的学校代表队名称&#xff0c;不接受跨市、跨校组队报名。 2.参赛队组成&#xff1a;本赛项为团体赛&#xff0c;以…

记删除CK不彻底问题 及 新增表TTL机制

问题背景&#xff1a;对CK表进行删除时&#xff0c;发现无法彻底删除&#xff0c;并报错如下&#xff1a; 同时也会有下面的报错信息&#xff1a; 解决过程&#xff1a; 确认CK 节点是否健康存活&#xff0c;select * from system.clusters 可以查看&#xff1b;确认CK元数据是…

redis中存储list<map>,list<entity>结构数据如何处理

redis中存储list结构数据如何处理 用到的工具类 1、序列化操作 String multiMapStr JSON.toJSONString(multiMapList); // list转换为json字符串 Object o JSON.parse(userList); // list转换为object List<Map<String, String>> maps CastBeanUtil.castListM…

基于ssm日用品网站设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本日用品网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…

openEuler商业化进展可观:累计装机量超610万套,市场持续扩容

12月15日至16日&#xff0c;以“崛起数字时代&#xff0c;引领数智未来”为主题的操作系统大会&#xff06;openEuler Summit 2023在北京国家会议中心举办。大会旨在汇聚全球产业界创新力量&#xff0c;构筑坚实的基础软件根基&#xff0c;推动基础软件技术持续创新&#xff0c…

win10 node-red安装及管理配置

win10 node-red安装及管理配置 一、安装node.js环境二、安装node-red环境2.1 node-red安装2.2 node-red安全登录方式 三、pm2管理node-red服务3.1 安装pm23.2 pm2管理node-red服务 四、常用命令4.1 npm命令4.2 pm2命令 更多 本文旨在详细介绍windows10系统下的node-red开发配置…

visio打出根号,下标,并调整符号的大小

插入公式对象 打出根号和带下标的字母 调整符号大小 把做好的公式符号弄到visio中的图中 ctrla 复制符号 进入visio中粘贴 并 调整大小 调整大小直接拖动边框上的圆点即可。

java SSM酒店客房管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM酒店客房管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

在开发微信小程序的时候,报错navigateBack:fail cannot navigate back at firstpage

这个错误的意思是&#xff1a;在这个页面已经是第一个页面了&#xff0c;没办法再返回了 报错原因 这个错误原因其实也简单&#xff0c;就是在跳转的时候使用了wx.redirectTo()&#xff0c;使用wx.redirectTo()相当于重定向&#xff0c;不算是从上一个页面跳转过来的&#xf…

com.sun.org.apache.xerces.internal.impl.dv.util.Base64

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 Access restriction: The type Base64 is not API (restriction on required library D:\Java\jdk1.8.0_341\jre\lib\rt.jar) Maven Update Project 虽然没错误了&#xff0c;但是有警告&#xff0c;好奇&#xff1f;…

python进度条

分享一个进度条python库 瞬间觉得很酷 :)) 它的名字叫tqdm 效果图&#xff1a; 代码&#xff1a; import time from tqdm import tqdmfor i in tqdm(range(100), desc"Loading", unit"kb"):time.sleep(0.1)

中通单号查询,中通快递物流查询,对需要的单号进行备注

批量查询中通快递单号的物流信息&#xff0c;对需要的单号进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的“…

Ubuntu22,桌面服务状态查看与重启

Ubuntu22,桌面服务状态查看与重启 一、桌面服务状态查看 sudo systemctl status display-manager.service ms@moshui:~$ sudo systemctl status display-manager.service ● gdm.service - GNOME Display ManagerLoaded: loaded (/lib/systemd/system/gdm.service; static)…

系列一、Linux中安装MySQL

一、Linux中安装MySQL 1.1、下载MySQL安装包 官网&#xff1a;https://dev.mysql.com/downloads/file/?id523327 我分享的&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/188_9RnBYlWVzFb_UJH5aaQ?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 & 解压…