高精度减法(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(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输 ...
随机推荐
- 机器学习之BP神经网络
import random import math #神经元的定义 class Neuron: def __init__(self,bias): self.bias = bias self.weigh ...
- Android 12(S) 图形显示系统 - BufferQueue的工作流程(八)
题外话 最近总有一个感觉:在不断学习中,越发的感觉自己的无知,自己是不是要从"愚昧之巅"掉到"绝望之谷"了,哈哈哈 邓宁-克鲁格效应 一.前言 前面的文章中已经 ...
- CentOS7.5安装Ansible
安装ansible: 查看可用的ansible版本: yum list|grep ansible 方法一: 系统可用ansible版本太低,安装epel源: yum install epel-re ...
- 三极管与MOS管主要参数差别及驱动电路基极(栅极)串联电阻选取原则
三极管与MOS管都常在电路中被当做开关使用,比较起来: 1. 三极管集电极电流IC (一般为mA级别),远小于MOS管ID(一般为A级别),因此MOS管多用在大电流电路中,如电机驱动 2. 三极管耗散 ...
- sqlserver下载地址及密匙
SqlServer 2017 下载地址及密钥 下载地址: ed2k://|file|cn_sql_server_2017_developer_x64_dvd_11296175.iso|17697771 ...
- 团队vue基础镜像选择思考
前端镜像可以考虑使用nginx或者openresty; 镜像 大小 说明 nginx:1.20.2-alpine 8.41 MB 最小最新版本 nginx:1.21.4 50.95 MB 最新版本 n ...
- 为什么Java中不支持多重继承?
我发现这个 Java 核心问题很难回答,因为你的答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴.在 Java 中回答这种棘手问题的关键是准 ...
- 哪一个 bash 内置命令能够进行数学运算?
bash shell 的内置命令 let 可以进行整型数的数学运算. #! /bin/bash - - let c=a+b - -
- mybatis基础(全)
参考链接:Mybatis学习系列(一)入门简介 Mybatis学习系列(二)Mapper映射文件 Mybatis学习系列(三)动态SQL Mybatis学习系列(四)Mapper接口动态代理 Myba ...
- zookeeper 的应用
不建议使用(单独)zookeeper 做分布式队列,有几点原因,以下原因摘抄于curator的官网: 1.zookeeper有1MB的传输限制.而在队列中,拥有很多的数据节点,通常包括数千个,如果有较 ...