51Nod 1005 有负数的高精度加法

2024-04-03 07:38

本文主要是介绍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 ] );} elsefor( int i = la; i >= 1; --i ) printf( "%d", a[ i ] );printf( "\n" );return 0;
}

转载于:https://www.cnblogs.com/chy-2003/p/9640426.html

这篇关于51Nod 1005 有负数的高精度加法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/872296

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

高精度打表-Factoring Large Numbers

求斐波那契数,不打表的话会超时,打表的话普通的高精度开不出来那么大的数组,不如一个int存8位,特殊处理一下,具体看代码 #include<stdio.h>#include<string.h>#define MAX_SIZE 5005#define LEN 150#define to 100000000/*一个int存8位*/int num[MAX_SIZE][LEN];void

高精度计算----减法运算(浮点型)

基于上一贴,修改减法运算适合于高精度浮点型计算。 因为减法比加法难度大一点,考虑的地方也要多一些,可能代码有欠缺,欢迎指出。 运算说明: 1、相减函数依旧没改变,包括上一贴的判断被减数与减数的大小函数也没变。 2、增加两个函数,取小数位数函数和结果处理(回归小数点)函数 3、与加法浮点高精度运算相比,这里改变较多的是结果处理函数,加法加完后,位数不减反增,而且最多增一位。减法会消失掉好多

高精度计算----减法运算

处理大数减法运算: 1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。 2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。 3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。 测试程序效果如下:   以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

【OpenCV2.2】图像的算术与位运算(图像的加法运算、图像的减法运算、图像的融合)、OpenCV的位运算(非操作、与运算、或和异或)

1 图像的算术运算 1.1 图像的加法运算 1.2 图像的减法运算 1.3 图像的融合 2 OpenCV的位运算 2.1 非操作 2.2 与运算 2.3 或和异或 1 图像的算术运算 1.1 图像的加法运算 add opencv使用add来执行图像的加法运算 图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的. # 图片加法imp

高精度治具加工的重要性和创新性

在现代制造业中,高精度治具加工扮演着至关重要的角色。它不仅是生产过程中的关键环节,更是推动行业不断创新和发展的重要力量。时利和将解析高精度治具加工的重要性和创新性。   一、高精度治具加工的重要性   1.确保产品质量   高精度治具能够为生产过程提供准确的定位、夹紧和导向功能,从而确保产品的尺寸精度、形状精度和表面质量。例如,在电子制造领域,高精度的治具可以保证芯片的精确安装,提高电子

题目:输入 5 个数(含负数、小数)将它们按由小到大的顺序排列起来。提示:需要排序的数字通过参数传递进来。

题目:输入 5 个数(含负数、小数)将它们按由小到大的顺序排列起来。 提示:需要排序的数字通过参数传递进来。 例如: 输入:-1 2.1 -3 5 7 输出: -3 -1 2.1 5 7 import java.util.Scanner;public class FuShuXiaoShuPaiXu {public static void swap(double[] arr,int a,in

【HDU】4927 Series 1 高精度

传送门:【HDU】4927 Series 1 题目分析:公式很好推,到最后就是C(n-1,0)*a[n]-C(n-1,1)*a[n-1]+C(n-1,2)*a[n-2]+...+C(n-1,n-1)*a[n]。 用C(n,k)=C(n,k-1)*(n-k+1)/k即可快速得到一行的二项式系数。 我看JAVA不到1000B 15分钟就能过。。。我又敲了大数模板然后将近2个小时才过T U