大数减法

思路:

     同大数加法,采用模拟笔算减法的策略,注意细节处理的问题。同样返回的为string类。

代码如下:

 

 1 /*
 2  1.比较减数与被减数的长度,确定正负号
 3  2.模拟笔算
 4       (1)a[i]==b[j] 
 5       (2)a[i]<b[j] //退位
 6       (3)a[i]>b[j] 
 7 */
 8 #include<iostream>
 9 #include<string>
10 using namespace std;
11 string jianfa(string a,string b)
12 {
13   string c="",ans="",t;
14   int  flag=0,k=0;//flag退位的标志
15   bool flag2=false;//结果正负的标志
16   if(a.length()<b.length()||(a.length()==b.length()&& a.compare(b)<0))
17   { t=a;a=b;b=t;flag2=true;}
18   int i=a.length()-1,j=b.length()-1;
19   while(i>=0&&j>=0)
20   {
21     if(a[i]+flag>b[j])
22     {
23       c+=a[i]+flag-b[j]+'0';
24       flag=0;
25     }
26     else if (a[i]+flag==b[j])
27     {
28       c+='0';
29       flag=0;
30     }
31     else
32     {
33       c+=(a[i]-'0')+flag+10-(b[j]-'0')+'0';
34       flag=-1;
35     }
36     i--;j--;k++;
37   }
38 while(i>=0)
39 {
40    if(a[i]+flag<'0')
41    {
42       c+=a[i]+flag+10+'0';
43       flag=-1;
44    }
45   else
46   {
47       c+=a[i]+flag;
48       flag=0;
49   }
50 i--,k++;
51 }
52   int len=k-1;
53 while(c[len]=='0'&&len>0)len--;//检索高位
54 for(j=0;j<=len;j++)
55   ans+=c[j];
56 if(flag2)
57 { ans+='-';}//结果正负判断
58 char tt;
59 for(i=0,j=ans.length()-1;i<j;i++,j--)//倒置
60 { tt=ans[i];ans[i]=ans[j];ans[j]=tt;}
61 return ans;
62 }
63 int main()
64 {
65  string a,b;
66  while(cin>>a>>b)
67  {
68    cout<<jianfa(a,b)<<endl;
69  }
70 return 0;
71 }

 

 

 

posted on 2012-07-21 14:27  L_S_X  阅读(1968)  评论(1编辑  收藏  举报

导航