高精度减法

简介

用于计算含有超过一般变量存放不下的非负整数

高精度加法这个过程是模拟的小学竖式减法计算

注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数

原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(C++实现)》

主要步骤

  • 清零
  • 逆置
  • 转换
  • 相减计算(包含退位)

代码实现

逆置

因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置

//参数:需要逆置的数组,数组长度
void invertElem(char s[], size_t n)
{size_t len = n-1;for(size_t i=0,j=len;i<j;i++,j--){char temp = s[i];s[i] = s[j];s[j] = temp;}
}

转换

为了方便计算和进位,我们需要将字符型的数字转化成实际数字

注意:这里的转换不是类型转换,例如字符类型8,我们要让它自减48,转化成ASCII码为8的对应的字符,存放元素的数组的类型并没有改变

转换必须在逆置之后。如果转换在前逆置在后,则逆置时分不清末尾的0是数字的一部分还是结束符转换后的数字

//参数:数组,长度
void charInt(char s[], size_t n)
{for(size_t i=0; i<n; i++)s[i]-=48;
}

相减

int main()
{while(1){char a[1024];char b[1024];char c[2049];memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));if(scanf("%s%s",a,b)==EOF) break;size_t len_a = strlen(a);size_t len_b = strlen(b);size_t max_len = len_a>len_b?len_a:len_b;invertElem(a,len_a);invertElem(b,len_b);charInt(a,len_a);charInt(b,len_b);//这部分是高精度减法的核心int carry = 0;for(size_t i=0; i<=max_len; i++){c[i] = (a[i]-carry<b[i])?(10+a[i]-carry-b[i]):(a[i]-carry-b[i]);carry = (a[i]-carry<b[i])?1:0;}int i;for(i=max_len; i>=1&&c[i]==0; i--);for(; i>=0; i--)printf("%d", c[i]);printf("\n");}return 0;
}

完整代码

#include <bits/stdc++.h>using namespace std;//逆置
void invertElem(char s[], size_t n)
{size_t len = n-1;for(size_t i=0,j=len;i<j;i++,j--){char temp = s[i];s[i] = s[j];s[j] = temp;}
}//转换
void charInt(char s[], size_t n)
{for(size_t i=0; i<n; i++)s[i]-=48;
}int main()
{while(1){char a[1024];char b[1024];char c[2049];memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));if(scanf("%s%s",a,b)==EOF) break;size_t len_a = strlen(a);size_t len_b = strlen(b);size_t max_len = len_a>len_b?len_a:len_b;invertElem(a,len_a);invertElem(b,len_b);charInt(a,len_a);charInt(b,len_b);//这部分是高精度减法的核心int carry = 0;for(size_t i=0; i<=max_len; i++){c[i] = (a[i]-carry<b[i])?(10+a[i]-carry-b[i]):(a[i]-carry-b[i]);carry = (a[i]-carry<b[i])?1:0;}int i;for(i=max_len; i>=1&&c[i]==0; i--);for(; i>=0; i--)printf("%d", c[i]);printf("\n");}return 0;
}

高精度减法(C++实现)相关推荐

  1. 高精度减法(洛谷-P2142)

    题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 源代码 #inc ...

  2. CCF NOI1139 高精度减法

    问题链接:CCF NOI1139 高精度减法. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 给两个正整数a和b,计算它们的差.题目保证a>=b 输入 两行每行一个数, ...

  3. (压位)高精度乘法,高精度加法,高精度减法,高精度除法

    大值 乘 大值: 题目链接:https://www.luogu.com.cn/problem/P1303 # include <iostream> # include <string ...

  4. 高精度算法——高精度减法

    介绍: 高精度减法也同加法一样,也是用于位数太大的运算,给你一个十几位的数你可能会做直接开个long long 的数据类型就解决了,但是给你一个100位的呢,1000位的呢,开long long 也不 ...

  5. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结

    一.引言 对于数字的储存,用实数类型总会有一些不足,比如: 使用int 只能最多存储4个字节,范围也就是2的32次方: 使用double 只能最多储存8字节,就是2的64次方: 如果数字超过这个限制, ...

  6. C语言实现高精度减法

    大一小白尝试C语言高精度减法 一.引言 笔者是一位大一学生,在做题的过程中接触到了高精度除法,而其中计算商的过程中需要用到高精度减法,因此写下这篇博客帮助理清思路.希望这篇博客能够帮助到更多刚接触C语 ...

  7. 高精度减法(C语言实现)

    高精度,是学C语言漫长的路上必须要学的一类程序 >>>高精度加法(C语言实现)<<< >>>高精度减法(C语言实现)<<< &g ...

  8. Java实现 蓝桥杯 算法提高 高精度减法(JDK方法)

    试题 算法提高 高精度减法 问题描述 高精度减法 输入格式 两行,表示两个非负整数a.b,且有a > b. 输出格式 一行,表示a与b的差 样例输入 1234567890987654321 99 ...

  9. 【Luogu2142】【模板】高精度减法

    problem solution codes //高精减法 //高精度的本质,用长度无限的数组或字符串代替int //原理:模拟减法退位 #include<iostream> #inclu ...

最新文章

  1. switch语句中在case块里声明变量会遇到提示“Expected expression before...的问题
  2. shell用到的命令(2) —— break,continue,echo,eval,
  3. 面试(之)三赴上海易传媒—揭秘之旅
  4. 第八篇——Struts2的处理结果类型
  5. iis6 配置python CGI
  6. android 瀑布流
  7. GoogleNet_V3结构(论文复现)
  8. str_pos php,关于php中str_replace替换漏洞的分析
  9. php getelement,javascript getElementByTagName的使用_javascript技巧
  10. 【Allwinner】---全志GPIO号 计算 最新最详细
  11. 微信云托管云调用使用指南
  12. 南通市城管局推动“数字化城管”向“智慧城管”升级
  13. java选择,智力,数量,推理
  14. 调制深度(modulation depth)是什么?
  15. 空气净化器哪个牌子好,除甲醛空气净化器什么牌子好推荐
  16. redis简略版笔记
  17. Python-数据类型考试题分析
  18. 正和岛青年徽商正和塾小组2021年首聚—走进掌榕
  19. C++primeplus P368-P391
  20. 【硬件电路设计】滤波电容

热门文章

  1. C++虚继承下的内存模型(二)
  2. switch手柄可以连电脑吗_电脑可以拍照吗
  3. 53. Leetcode 112. 路径总和 (二叉树-二叉树路径和)
  4. tensorflow就该这么学--5( 神经网络基础)
  5. python programming training(一):最大回文子字符串
  6. python爬虫应用实战-如何爬取好看的小姐姐照片?
  7. tensorflow从入门到精通100讲(七)-TensorFlow房价预估使用Keras快速构建模型
  8. java在线学习系统源码_Java在线考试系统源码
  9. MATLAB中GUI设计的基本操作
  10. Python程序全局观--以温度转换为例