大数据加减(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("\n"); 
84     return 0;
85 }

 

 
 
posted @ 2015-03-21 14:17  Memoryヾノ战心  阅读(609)  评论(0编辑  收藏  举报