大数据加减(Big data addition and subtraction)
题目描述 Description
加减法是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(不超过1000位)的加减法算式,请给出正确结果。为提高速度,保证给定运算的结果均为正整数。
输入输出格式 Input/output
输入格式:
一行:一个加法或减法的表达式
输出格式:
一个正整数,表示计算的结果(不可以有前导0)
一行:一个加法或减法的表达式
输出格式:
一个正整数,表示计算的结果(不可以有前导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("\n"); 84 return 0; 85 }
我不怕千万人阻挡,只怕自己投降…