zoukankan      html  css  js  c++  java
  • 洛谷P2142 高精度减法 题解

    想找原题请点击这里:传送门

    原题:

    题目描述
    高精度减法
    
    输入格式
    两个整数a,b(第二个可能比第一个大)
    
    输出格式
    结果(是负数要输出负号)
    
    输入输出样例
    输入 复制
    2
    1
    输出 复制
    1
    说明/提示
    20%数据a,b在long long范围内
    
    100%数据0 < a,b <10^10086 (此处^为乘方)

    再简单讲一下高精度运算的原理。

    为什么要产生高精度运算?

    由于c++的数据结构非常严谨,然而c++提供的储存数的数据结构只有int和long long,当则两种数据类型进行运算时当储存数据过大都会导致溢出问题。

    所以高精度就诞生了!

    高精度大概流程:

    1.将要进行特定运算的两数以字符串形势储存起来

    2.将字符串中储存的数从最低位到最高位(最高的最高位)顺序用int类型存起来

    3.进行运算

    4.进行每位的进位和最高位更新

    5.去掉前导零

    那么代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define N 10087
     5 using namespace std;
     6 char a[N];
     7 char b[N];
     8 char ta[N];
     9 char ans[N];
    10 int aa[N],bb[N],ansa[N];
    11 int tb;
    12 bool flag;
    13 int main()
    14 {
    15     scanf("%s",&a);
    16     scanf("%s",&b);
    17     int la=strlen(a),lb=strlen(b);
    18     if(lb>la) {
    19         flag=true;
    20         strcpy(ta,a);strcpy(a,b);strcpy(b,ta);
    21         tb=la;la=lb;lb=tb;
    22     }
    23     else{
    24         if(la==lb){
    25             for(int i=0;i<la;i++){
    26                 if(a[i]==b[i]){
    27                     continue;
    28                 }
    29                 if(a[i]>b[i]){
    30                     break;
    31                 }
    32                 flag=true;
    33                 strcpy(ta,a);strcpy(a,b);strcpy(b,ta);
    34                 tb=la;la=lb;lb=tb;
    35                 break;
    36             }
    37         }
    38     }
    39     for(int i=1;i<=la;i++){
    40         aa[i]=a[la-i]-'0';
    41     }
    42     for(int i=1;i<=lb;i++){
    43         bb[i]=b[lb-i]-'0';
    44     }
    45     int mm=max(la,lb);
    46     for(int i=1;i<=mm;i++){
    47         ansa[i]+=(aa[i]-bb[i]);
    48         if(ansa[i]<0){
    49             ansa[i]+=10;
    50             ansa[i+1]--;
    51         }
    52     }
    53     for(int i=mm;i>=2;i--){
    54         if(ansa[i]){
    55             break;
    56         }
    57         mm--;
    58     }    
    59     if(flag) printf("-");
    60     for(int i=mm;i>=1;i--){
    61         printf("%d",ansa[i]);
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    动态内存
    用c的数组简单的模拟了入栈
    c++实验,需要的人都知道是啥
    c语言的一个简单的链表
    c++的引用
    c++的一个有趣的程序
    奥运五环的绘制
    网页中的事件与事件响应
    响应事件的示例
    关于window.onload,window.onbeforeload与window.onunload
  • 原文地址:https://www.cnblogs.com/robertspot/p/12375979.html
Copyright © 2011-2022 走看看