51Nod 1005 有负数的高精度加法
51Nod是个好地方啊
题意
51Nod基础题第二题,高精度加法,可能有负数。
解题
如果按照一般的高精度,我们发现要分情况讨论,还要写高精度加法和减法,代码实现有点烦。而初中数学里说,省略加号的和。也就是说,只有加法,没有减法。那么我们又没有办法在做高精度的时候也统一加减法?
当然有咯,不然我写这博客干啥
那么到底怎么办呢?
我们还是以加法作为基准,统一加减法。我们知道,减去某个数,就是加上它的相反数。这对于高精度中每一位的操作也是同理。然后我们考虑进位的问题。同样的,我们最后输出每个数位上的数应当在\(0\)到\(9\)之间。这也就是说,我们进位应当是这样的:
a[ i + 1 ] += a[ i ] / 10;
a[ i ] %= 10;
if( a[ i ] < 0 ) {
a[ i ] += 10;
--a[ i + 1 ];
}
结束了?当然没有!还有一个很大的问题。我们发现,如果结果是个负数,那么首位不论如何都不可能落在\(0\)到\(9\)。这在程序里的表现为是这样的(以\(-1\)举例,从高位到低位):\(-1\), \(9\), \(9\), \(9\), ……
都是进位的锅……
为什么会这样呢?我们了解一下这些数的具体意义。\(-1(-1\times 10^n)\), \(9(9\times 10^{n-1})\), \(9(9\times10^{n-2})\), \(9(9\times10^{n-3})\), …… 加起来确实是\(-1\)。而如果不加处理,直接输出,它的意义就变为了\(-1(-1\times 10^n)\), \(9(-9\times 10^{n-1})\), \(9(-9\times10^{n-2})\), \(9(-9\times10^{n-3})\), ……,也就是\(-19999...\)。
所以呢,我们只需要在负数的时候先输出负号,对每个数位取相反数,再重新进位一遍就好了。
参考程序
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char ch[ 10010 ];
int a[ 10010 ], b[ 10010 ], la, lb;
int main() {
scanf( "%s", ch + 1 );
if( ch[ 1 ] == '-' ) {
la = strlen( ch + 1 ) - 1;
for( int i = 2; i <= la + 1; ++i ) a[ la + 1 - i + 1 ] = -( ch[ i ] - '0' );
} else {
la = strlen( ch + 1 );
for( int i = 1; i <= la; ++i ) a[ la - i + 1 ] = ch[ i ] - '0';
}
scanf( "%s", ch + 1 );
if( ch[ 1 ] == '-' ) {
lb = strlen( ch + 1 ) - 1;
for( int i = 2; i <= lb + 1; ++i ) b[ lb + 1 - i + 1 ] = -( ch[ i ] - '0' );
} else {
lb = strlen( ch + 1 );
for( int i = 1; i <= lb; ++i ) b[ lb - i + 1 ] = ch[ i ] - '0';
}
//以上是读入
la = max( la, lb ) + 1;
for( int i = 1; i < la; ++i ) a[ i ] += b[ i ];
for( int i = 1; i < la; ++i ) {
a[ i + 1 ] += a[ i ] / 10;
a[ i ] %= 10;
if( a[ i ] < 0 ) {
a[ i ] += 10;
--a[ i + 1 ];
}
}
while( la > 1 && a[ la ] == 0 ) --la;
if( a[ la ] < 0 ) {
printf( "-" );
for( int i = 1; i <= la; ++i ) a[ i ] = -a[ i ];
for( int i = 1; i < la; ++i ) {
if( a[ i ] < 0 ) {
a[ i ] += 10;
--a[ i + 1 ];
}
}
while( la > 1 && a[ la ] == 0 ) --la;
for( int i = la; i >= 1; --i ) printf( "%d", a[ i ] );
} else
for( int i = la; i >= 1; --i ) printf( "%d", a[ i ] );
printf( "\n" );
return 0;
}
51Nod 1005 有负数的高精度加法的更多相关文章
- 大数高精度加减乘除 51nod 1005 大数加法
1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...
- 高精度加法——经典题 洛谷p1601
题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...
- hdu1002 A + B Problem II(高精度加法) 2016-05-19 12:00 106人阅读 评论(0) 收藏
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- NEFU 2016省赛演练一 F题 (高精度加法)
Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...
- java算法 蓝桥杯 高精度加法
问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...
- 用c++实现高精度加法
c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以 ...
- 高精度加法--C++
高精度加法--C++ 仿照竖式加法,在第一步计算的时候将进位保留,第一步计算完再处理进位.(见代码注释) 和乘法是类似的. #include <iostream> #include < ...
- POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...
- leetcode 67. Add Binary (高精度加法)
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...
随机推荐
- java生成0~9个9个不相等的整数
HashSet<Integer> hs=new HashSet<Integer>(); Integer i=0; while (i<9){ int s=(int) Mat ...
- nginx反向代理_负载均衡
注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...
- [Nest] 03.nest之提供者 provider
提供者 provider 提供程序是 Nest 的一个基本概念.许多基本的 Nest 类可能被视为提供者 - service,repository, factory, helper 等等. 他们都可以 ...
- 为什么单线程的Redis却能支撑高并发
Redis的高并发和快速原因 redis是基于内存的,内存的读写速度非常快: 核心是基于非阻塞的IO多路复用机制: redis是单线程的,反而省去了很多上下文切换线程的时间: 为什么Redis是单线程 ...
- Hadoop学习之 HIVE 多用户模式安装
一.启动hadoop 集群 1.启动zookeeper 集群 zkServer.sh start 2.在master.hadoop 机器上 ./start-all.sh 由于 start-all命 ...
- python cv2截取不规则区域图片
知识掌握 cv2.threshold()函数: 设置固定级别的阈值应用于多通道矩阵,将灰度图像变换二值图像,或去除指定级别的噪声,或过滤掉过小或者过大的像素点. Python: cv2.thresho ...
- Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历
package com.example.demo; public class BTree { public int data; public BTree left; public BTree rigt ...
- 3.flask核心与源码剖析
1.session session存储了特定用户会话所需的属性及配置信息,这样,当用户在应用程序的 Web 页之间跳转时,存储在 session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下 ...
- 制作嵌入式linux内核
拿到一个嵌入式linux内核代码,首先make distclean 接下来,如果在x86平台,就直接make menuconfig,如果是在ARM平台,就直接make menuconfig ARCH= ...
- Linux禁止root远程登录及修改默认端口
1.1 修改SSHD配置,禁止root远程登录 禁止登录之前先穿甲一个可以远程登录的普通用户,以免造成登录不了的情况 [root@jhkj66 ~]# useradd yw001 #创建用户 [roo ...