长整数四则运算
假定两个数都为非负数,将长整数作为字符串进行处理。
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

浙公网安备 33010602011771号