高精度运算 【加法】【减法】

高精度算是我高中期间没有学明白的知识点之一,其实挺简单的东西。核心思路是【按位模拟竖式运算】,说白了就是模拟题。

加法减法从低位到高位模拟,因为会进位借位

乘法也从低到高因为进位

除法要从高到低因为我们手算除法时也是从高到低保留余数的。

高精度减法:https://www.luogu.org/problemnew/show/P2142

 1 #include<iostream>
 2 using namespace std;
 3
 4 string a1,b1;
 5 int a[10005],b[10005],temp[10005];//由低位到高位
 6 int ans[10005];
 7 bool biga=false,bigb=false;
 8
 9 int main(){
10     cin>>a1>>b1;
11     for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48;
12     for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48;
13
14     if(a1.length()>b1.length()) biga=true;
15     else if(b1.length()>a1.length()) bigb=true;
16     else{
17         for(int i=a1.length();i>=1;i--){
18             if( a[i]>b[i] ) { biga=true; break; }
19             else if( b[i]>a[i] ) { bigb=true; break; }
20         }
21         if(!biga && !bigb) { cout<<0; return 0; }
22     }
23     int length=max(a1.length(),b1.length());//要考虑这么多上下相减
24
25     if(bigb){
26         for(int i=1;i<=length;i++) temp[i]=a[i];
27         for(int i=1;i<=length;i++) a[i]=b[i];
28         for(int i=1;i<=length;i++) b[i]=temp[i];
29     }
30
31     for(int i=1;i<=length;i++){
32         ans[i] += a[i]-b[i];
33         if(ans[i]<0) { ans[i]+=10; ans[i+1]-=1; }
34     }
35     int len=length;
36     for(int i=length;i>=1;i--) {
37         if( ans[i]==0 ) len--;
38         else break;
39     }
40     if(bigb) cout<<"-";
41     for(int i=len;i>=1;i--) cout<<ans[i];
42
43     return 0;
44 }

高精度加法:https://www.luogu.org/problemnew/show/P1601

 1 #include<iostream>
 2 using namespace std;
 3
 4 string a1,b1;
 5 int a[505],b[505];//由低位到高位
 6 int ans[505];
 7
 8 int main(){
 9     cin>>a1>>b1;
10     for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48;
11
12     for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48;
13
14     int length=max(a1.length(),b1.length());//要考虑这么多上下相加
15     for(int i=1;i<=length;i++){
16         ans[i] += a[i]+b[i];
17         if(ans[i]>9) { ans[i]-=10; ans[i+1]=1; }
18     }
19     if(ans[length+1]!=0) length+=1;
20     for(int i=length;i>=1;i--) cout<<ans[i];
21
22     return 0;
23 }

原文地址:https://www.cnblogs.com/ZhenghangHu/p/9339111.html

时间: 2024-10-19 17:01:50

高精度运算 【加法】【减法】的相关文章

整数高精度运算——加法

高精度运算是信息学的一种重要算法.这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法.也是一些信息学竞赛的常考题目. 高精度运算主要有以下几个步骤: 1.读取字符串,转换成数字倒序存储到整数数组中: 2.运算,注意进位和借位: 3.倒序输出整数数组,加法注意最高位进位,减法注意高位中的无用的0不要输出: 高精度加法代码: #include<stdio.h>#include<string.h>char s[1000];       //数组比较大时,应作

高精度运算1

1.高精度运算_加法 AYYZOJ p1443 COGS p37 1 type 2 arr=array[1..200]of integer; 3 var 4 a,b:arr;i,la,lb:integer; n:string; 5 procedure add(a,b:arr;la,lb:integer); 6 var i,x,lc:integer; c:arr; 7 begin 8 i:=1; x:=0; 9 while (i<=la) or(i<=lb) do 10 begin x:=a[i

高精度运算

在开发中高精度运算使用并非非常频繁,float和double的精度实际上能够满足绝大多数需要,且高精度运算效率比常规的运算要慢一点,但使用高精度运算往往是为了使用其中便捷的API.官方提供的高精度运算的类主要两个 BigInteger:当数值范围超过long时使用 BigDecimal:几乎涵盖BigInteger功能,还可以保留小数点任意位数,理论上精度无穷大,以下主要说明此类 注:两者API很相似 加减乘除 BigDecimal aaa = new BigDecimal(20); BigDe

BigDecimal 加法减法乘法除法

Java的简单类型不能够精确的对浮点数进行运算 /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); ret

[入门]高精度运算

(本人知识 while(1)cout<<"非常"; 有限,如果你看到我有任何错漏或者不足,真的真的真的恳请大家指出,蟹蟹,我希望大家可以一起进步~) int类型的变量只能存放-2^31~2^31-1范围的数据 long long类型的变量只能存放-2^63~2^63-1范围的数据 对于大数阶乘这种肯定是存不下,因此我们需要用数组存放数据: 下面是一个高精度运算的例子: 题目描述 用高精度计算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤5

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

高精度运算专题3-乘法运算(The multiplication operation)

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面 函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了. ①记录数组a.数组b的长度,放到第一位 ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值 ③最后记得要

大数高精度运算(模板)

前言:高精度运算.是指參与运算的数(加数.减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算. 模板:包含大数加减乘除.大数与int数的乘法,模板能够不断扩充. 代码: /* 所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算 */ const int ten[4]= {1,10,100,1000}; const int maxl = 300; struct BigNumber { int d[maxl]; char s[maxl]; BigNumber(co

算法学习笔记(三)问题的转化与高精度运算

问题:设购票点没有任何的零钱,票价50美元,现有m人手持50美元,n人手持100美元,求这样m+n个人构成的队伍有多少种排队方法可以使得整个售票过程不中断. 分析:对于这个问题,经过简单的模拟可以发现,每个手持100的前面必须有一个手持50的,同样如果有k个手持100的连续出现,则前面至少连续k次50. 这样一来,可以设手持50元的为+1,手持100元的为-1,设ai为为第i个人所对应的值,则问题转化为数组的部分和a1+a2+...+ak≥0,其中k≤m+n,为了求这样的数列的个数,需要使用组合