长整数四则运算

假定两个数都为非负数,将长整数作为字符串进行处理。

1. 加法

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int ch2int(char ch)
 6 {
 7     return ch-'0';
 8 }
 9 
10 int int2ch(int i)
11 {
12     return i+'0';
13 }
14 
15 string clear(string str)
16 {
17     //remove extra zeros
18     int pos = str.find_first_not_of('0');
19     if(pos == string::npos)
20         return "0";
21     else
22         return str.substr(pos, str.length()-pos);
23 }
24 
25 string add(string a, string b)
26 {
27     int alen = a.length(), blen = b.length(), len = alen;
28     //pad zeros in front of the shorter one
29     if(alen < blen)
30     {
31         len = blen;
32         string padding(blen-alen, '0');
33         a = padding + a;
34     }
35     else if(blen < alen)
36     {
37         string padding(alen-blen, '0');
38         b = padding + b;
39     }
40 
41     int carry = 0;
42     string result(len+1, '0');
43     for(int i=len-1;i>=0;i--)
44     {
45         int sum = ch2int(a[i]) + ch2int(b[i]) + carry;
46         carry = sum<10 ? 0 : sum/10;
47         result[i+1] = int2ch(sum - carry*10);
48     }
49     result[0] = int2ch(carry);
50 
51     return clear(result);
52 }
53 
54 int main()
55 {
56     string a, b;
57     while(1)
58     {
59         cin >> a >> b;
60         cout << add(a, b) << endl;
61     }
62 
63     return 0;
64 }

测试输入:

123456789
987654321

0
0

123
45

987
65

因为上课的时候听老师讲了算法,所以该考虑的都已经知道了,主要就是注意补齐和消零。
写程序的时候主要用到string的函数,我不熟悉的有这几个:

string str(int len, char ch)
str.find_first_not_of(char ch)  //找不到时返回string::npos
str.substr(int pos, int len)  

 

2. 在1的基础上实现减法

 1 int cmp(string a, string b) // -1:a<b; 0:a==b; 1:a>b
 2 {
 3     int alen = a.length(), blen = b.length();
 4     if(alen==blen)
 5     {
 6         int i=0;
 7         while(a[i]==b[i])
 8         {
 9             i++;
10             if(i==alen)
11                 return 0;
12         }
13         if(a[i]<b[i])
14             return -1;
15         else
16             return 1;
17     }
18 
19     if(alen>blen)
20         return 1;
21     else
22         return -1;
23 }
24 
25 string subtract(string a, string b)
26 {
27     int cmpFlag = cmp(a, b), alen = a.length(), blen = b.length(), len = alen;
28     if(cmpFlag==0)
29         return "0";
30 
31     //pad the shorter one
32     if(alen < blen)
33     {
34         len = blen;
35         string padding(blen-alen, '0');
36         a = padding + a;
37     }
38     else if(alen > blen)
39     {
40         string padding(alen-blen, '0');
41         b = padding + b;
42     }
43 
44     string *larger = &a, *smaller = &b;
45     if(cmpFlag == -1)
46     {
47         larger = &b;
48         smaller = &a;
49     }
50 
51     string result(len, '0');
52     int borrow = 0;
53     for(int i=0;i<len;i++)
54     {
55         int diff = ch2int((*larger)[i])-ch2int((*smaller)[i])+borrow*10;
56         borrow = 0;
57         if(i<len-1)
58         {
59             if((*larger)[i+1]<(*smaller)[i+1])
60                 borrow = 1;
61         }
62         result[i] = int2ch(diff-borrow);
63     }
64 
65     result = clear(result);
66     if(cmpFlag == -1)
67         result = '-' + result;
68     return result;
69 }

测试输入:

0
0

21
21

189
23

32
123


3. 用加法实现乘法

 1 string multiply(string a, string b)
 2 {
 3     int alen = a.length(), blen = b.length();
 4     string result = "0";
 5     for(int i=0;i<alen;i++)
 6     {
 7         int val = ch2int(a[alen-1-i]);
 8         string prod = "0";
 9         while(  val--)
10             prod = add(prod, b);
11         string shift(i, '0');
12         result = add(result, prod+shift);
13     }
14     return result;
15 }

测试输入:
0 0
1 1
1 10
1 23
10 1
23 1
0 999
9999 0
12 13
11111 11111
12345679 9
80008 1111
9999999 9999999


4. 用减法实现除法

 1 string divide(string a, string b)
 2 {
 3     if(b=="0")
 4         return "nan";
 5 
 6     int alen = a.length(), blen = b.length(), cmpFlag;
 7     if(alen<blen)
 8         return "0";
 9     string result = "", divider = "";
10     for(int i=0;i<alen;i++)
11     {
12         divider += a[i];
13         cmpFlag = cmp(divider, b);
14         if(cmpFlag>=0) // divider>=divisor
15         {
16             //use subtractions
17             string remainder = subtract(divider, b);
18             int count = 1;
19             cmpFlag = cmp(remainder, b);
20             while(cmpFlag>=0) // remainder>=divisor
21             {
22                 remainder = subtract(remainder, b);
23                 cmpFlag = cmp(remainder, b);
24                 count++;
25             }
26             result += int2ch(count);
27             divider = remainder;
28         }
29         else
30             result += '0';
31     }
32     return clear(result);
33 }

测试输入:
0 1984
1 1
1 2
2 1
2345 2345
2345 2346
987654321 12345678
1476 456

posted @ 2013-11-03 22:00  peach_planet  阅读(430)  评论(0)    收藏  举报