• 大数据加减(Big data addition and subtraction)


    题目描述 Description
    加减法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(不超过1000位)的加减法算式,请给出正确结果。为提高速度,保证给定运算的结果均为正整数。
     输入输出格式 Input/output
    输入格式:
    一行:一个加法或减法的表达式
    输出格式:
    一个正整数,表示计算的结果(不可以有前导0)
     输入输出样例 Sample input/output
    样例测试点#1
    输入样例:
    12345678+111
    输出样例:

    123456789

    思路:这题的数据量很大,有1000位,如果用int或longlong类型的直接计算是不可取的,必须用高精度算法。
    这里可以分为步来算:
    ①用字符串读入数组
    ②扫描一遍数组,把操作符前后的两段存入两个数组
    ③利用高精度加减法计算两数组之和或之差存入a数组或b数组(你想怎么样都行)
    ④for循环输出(倒序)
    补充:高精度算法是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算
    代码如下:
     1 #include<stdio.h>
     2 #include<string.h> 
     3 int a[1001]={0},b[1001]={0};
     4 int i,ka,kb,k,c,temp;
     5 char s[2002],ch;
     6 void plus()//高精度加法函数 
     7 {
     8     for(i=0;i<k;i++)
     9     {
    10         a[i]=a[i]+b[i]+c;//按位加 
    11         if(a[i]>=10)//处理进位(满十进一) 
    12         {
    13         a[i]=a[i]%10;
    14         c=1; 
    15         }
    16         else c=0;
    17     }
    18     if(c>0)
    19     {
    20         a[k]=c;
    21         k++;
    22     }
    23 }
    24 void minus()//高精度减法函数
    25 {
    26     for(i=0;i<ka;i++)
    27     {
    28         if(a[i]<b[i])//判断这一位计算是否要借位 
    29         {
    30             c=1;
    31             a[i+1]--;
    32         }
    33     else
    34     c=0;
    35     a[i]=a[i]+c*10-b[i];//计算这一位的结果
    36     k=ka;
    37     while(a[k-1]==0&&k>0)
    38     k--; 
    39     }
    40 } 
    41 int main()
    42 {
    43     scanf("%s",s);
    44     k=0;
    45     while((s[k]!='+')&&(s[k]!='-'))//以运算符为界,分开两个操作数,期前部分计入数组a 
    46     {
    47         a[k]=s[k]-'0';
    48         k++;
    49     }
    50     ch=s[k];//记录操作符 
    51     ka=k;//记录操作符当前位置 
    52     kb=0;
    53     k++;//跳过继续 
    54     while(k<strlen(s))//运算符后部分计入数组b
    55     {
    56        b[kb]=s[k]-'0'; 
    57        k++;
    58        kb++;//记录运算符后部分的位数 
    59     } 
    60     if(ka>=kb) k=ka;//取a和b的最大长度,以便进行按位计算
    61     else k=kb;
    62     for(i=0;i<ka/2;i++)//读入是从高位到低位的顺序,计算之前应该反序
    63     {
    64         temp=a[i];
    65         a[i]=a[ka-i-1];
    66         a[ka-1-i]=temp;
    67     } 
    68     for(i=0;i<kb/2;i++)//读入是从高位到低位的顺序,计算之前应该反序 
    69     {
    70         temp=b[i];
    71         b[i]=b[ka-i-1];
    72         b[ka-1-i]=temp;
    73     }
    74     c=0;//进位初始化 
    75     if(ch=='+')//传入加法函数 
    76     plus();
    77     else //传入减法函数 
    78     minus();
    79     for(i=k-1;i>=0;i--)//按倒序输出结果     
    80     {
    81         printf("%d",a[i]);
    82     } 
    83     printf("
    "); 
    84     return 0;
    85 }
     
     
  • 相关阅读:
    Jexus部署Asp.Net Core项目
    Docker 学习
    mysql 调优 (转)
    ZXHN H218N 超级管理员账号
    微擎遇到 请先更新或安装主模块后再安装插件 问题解决
    centos7 + php7
    PPTPD 服务搭建
    精心调制的Bash主题分享
    vue
    木马技术
  • 原文地址:https://www.cnblogs.com/geek-007/p/4355552.html
Copyright © 2020-2023  润新知