• 3115 高精度练习之减法


    题目描述 Description

    给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。

    输入描述 Input Description

    读入两个用空格隔开的正整数

    输出描述 Output Description

    输出A-B的值

    样例输入 Sample Input

    3 12

    样例输出 Sample Output

    -9

    数据范围及提示 Data Size & Hint

    两个正整数的位数不超过500位

    首先判断结果正负,保留符号,将较大的值放在被减数。然后模拟减法过程,注意借位运算。

    附AC代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 const int MAX=510;
     6 int a[MAX],b[MAX],c[MAX];
     7 
     8 void ex(char *s1,char*s2){//交换函数 
     9     char temp[MAX];
    10     strcpy(temp,s1);
    11     strcpy(s1,s2);
    12     strcpy(s2,temp);
    13 }
    14 
    15 int main(){
    16     char al[MAX],bl[MAX];
    17     int sign,t;
    18     cin>>al>>bl;
    19     memset(a,0,sizeof(a));
    20     memset(b,0,sizeof(b));
    21     memset(c,0,sizeof(c));
    22     int lena=strlen(al);
    23     int lenb=strlen(bl);
    24     if(lena<lenb){//决定符号的正负 
    25         sign=-1;
    26         ex(al,bl);//结果为负时保存负号,两数交换 
    27         t=lena;
    28         lena=lenb;
    29         lenb=t;
    30     }
    31     else if(lena==lenb){
    32         for(int i=0;i<lena;i++){//长度相等时从最大位到最小位依次比较 
    33             if(al[i]<bl[i]){
    34                 sign=-1;
    35                 ex(al,bl);
    36                 break;
    37             }
    38             else if(al[i]>bl[i]){
    39                 sign=1;
    40                 break;
    41             }
    42             else
    43             sign=1;
    44         }
    45     }
    46     else
    47     sign=1;
    48     
    49     for(int i=0;i<lena;i++){//反向输入数组 
    50         a[lena-i]=al[i]-48;
    51     }
    52     for(int i=0;i<lenb;i++){
    53         b[lenb-i]=bl[i]-48;
    54     }
    55     for(int i=1;i<=lena;i++){//模拟减法运算 
    56         if(a[i]>=b[i]){
    57             c[i]=a[i]-b[i];
    58         }
    59         else{
    60             t=i+1;
    61             a[t]-=1;
    62             c[i]=a[i]+10-b[i];
    63         }
    64     }
    65     if(c[lena]==0)//防止首位为0 
    66     lena--;
    67     cout<<c[lena]*sign;//输出首位和符号 
    68     for(int i=lena-1;i>=1;i--){//依次输出各位的值 
    69         cout<<c[i];
    70     }
    71     cout<<endl;
    72     return 0;
    73 }
  • 相关阅读:
    解释器模式
    享元模式
    中介者模式
    职责链模式
    命令模式
    桥接模式
    Java迭代器Iterator
    [Swift]LeetCode1247. 交换字符使得字符串相同 | Minimum Swaps to Make Strings Equal
    [Swift]LeetCode1248. 统计「优美子数组」| Count Number of Nice Subarrays
    [Swift]LeetCode1239. 串联字符串的最大长度 | Maximum Length of a Concatenated String with Unique Characters
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/5672873.html
Copyright © 2020-2023  润新知