高精度减法(C++实现)
高精度减法
简介
用于计算含有超过一般变量存放不下的非负整数
高精度加法这个过程是模拟的小学竖式减法计算
注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数
原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(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++实现)的更多相关文章
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...
- 【洛谷P2142 高精度减法】
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 复制 2 1 输出样例#1: 复制 1 说明 ...
- 【洛谷p2142】高精度减法
高精度减法第一遍没有过 高精度减法[传送门] 洛谷算法标签: 总之技术都在高精上了吧. 附代码: #include<iostream> #include<cstdio> #in ...
- P2412高精度减法
传送门 因为忘了带书回家,所以因为这道题我卡了半小时所以写篇博客“纪念”下 高精度减法中,如果被减数比减数小,就要用减数减去被减数.接下来的判断就是本题的核心.直接用strcmp是不行的,例如100与 ...
- 高精度减法--C++
高精度减法--C++ 仿照竖式减法,先对其,再对应位相减. 算法处理时,先比较大小,用大的减小的,对应位再比较大小,用于作为借位符. #include <iostream> #includ ...
- P2142 高精度减法
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据 ...
- 洛谷 P2142 高精度减法(模板)
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据 ...
- 洛谷P2142 高精度减法 题解
想找原题请点击这里:传送门 原题: 题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) 输入输出样例 输入 复制 输出 复制 说明/提示 %数据 ...
- Java实现 蓝桥杯 算法提高 高精度减法(JDK方法)
试题 算法提高 高精度减法 问题描述 高精度减法 输入格式 两行,表示两个非负整数a.b,且有a > b. 输出格式 一行,表示a与b的差 样例输入 1234567890987654321 99 ...
- P2142_高精度减法(JAVA语言)
思路:BigInteger double kill! //四行搞定 题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输 ...
随机推荐
- Java安全第一篇 | 反射看这一篇就够了
什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...
- Microsoft .NET Framework 远程执行代码漏洞
受影响系统:Microsoft .NET Framework 4.8Microsoft .NET Framework 4.7.2Microsoft .NET Framework 4.7.1Micros ...
- 从HDFS的写入和读取中,我发现了点东西
摘要:从HDFS的写入和读取中,我们能学习到什么? 本文分享自华为云社区<从HDFS的写入和读取中,我们能学习到什么>,作者: breakDawn . 最近开发过程涉及了一些和文件读取有关 ...
- C# 将CSV转为Excel
CSV(Comma Separated Values)文件是一种纯文本文件,包含用逗号分隔的数据,常用于将数据从一个应用程序导入或导出到另一个应用程序.通过将CSV文件转为EXCEL,可执行更多关于数 ...
- Apache Tomcat如何高并发处理请求
介绍 作为常用的http协议服务器,tomcat应用非常广泛.tomcat也是遵循Servelt协议的,Servelt协议可以让服务器与真实服务逻辑代码进行解耦.各自只需要关注Servlet协议即可. ...
- Java中会存在内存泄漏吗,请简单描述?
为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间:那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存.如果存在无用的内 ...
- GC root & 使用MAT分析java堆
当我们的java程序遇到频繁full gc或者oom的时候,我们常常需要将当前的heap dump出来进行进一步的分析.MAT是用于分析heap dump的神器. 1 生成heap dump heap ...
- 在java web工程中实现登入和安全验证
登入页面的话我们之前做过直接可以拿来用翻一翻之前的博客就可以找到 在这个基础上添加验证功能 代码如下: 1 package security; 2 /** 3 * @author 鐜嬭儨鍗? 4 */ ...
- jsp报错问题之“使用jstl的c标签choose报错Illegal text inside "c:choose" tag问题”
一.报错 [bessky_it][ERROR][2022-03-25 17:19:07] | PLATFORM | ):[c]鍜孾/com.bessky.pss.portal/purchase/sam ...
- 使用 Vuex + Vue.js 构建单页应用
鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用[新篇] ------------------ ...