大整数模拟,很常用,记录下。
1. 加法模拟:
string res,a,b;
res = a + b
string &_string_add_string(const string &a, const string &b, string &res) { int sum_value = 0, add_bit = 0; const int alen = a.length(), blen = b.length(); res = "0" + (alen > blen ? a : b); for (int i = alen-1, j = blen-1, k = res.length() - 1; i >= 0 || j >= 0 || add_bit > 0; --i, --j, --k){ sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit; add_bit = sum_value / 10; res[k] = sum_value%10 + '0'; } if (res[0] == '0') res = res.substr(1, res.length() - 1); return res; }
2. 减法:
void sub(char *szLine1, char *szLine2, int nLen1, int nLen2) { int i , j = 0; for( i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; j = 0; for( i = nLen2 - 1;i >= 0 ; i--) an2[j++] = szLine2[i] - '0'; for( i = 0;i < MAX_LEN ; i ++ ) { if(an1[i] >= an2[i]) //逐位相减 an1[i] -= an2[i]; else { an1[i+1]--; an1[i] += 10; an1[i] -= an2[i]; } } bool bStartOutput = false; //此变量用于跳过多余的0 for( i = MAX_LEN; i >= 0; i-- ) { if( bStartOutput) printf("%d", an1[i]); //如果多余的0已经都跳过,则输出 else if( an1[i] ) { printf("%d", an1[i]); bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过 } } if(!bStartOutput) //结果为0特殊处理 printf("0"); }
3.乘法
依赖于加法
string res,a,b;
res = a * b;
和小学生计算乘法的方法一样
string &_del_zeros_before_dot(string &a) { if (a.length() <= 0 || a[0] != '0') return a; int i = 0; while (i < a.length() && a[i] == '0') ++i; a = a.substr(i, a.length() - i); return a; } string &_string_add_string(const string &a, const string &b, string &res) { int sum_value = 0, add_bit = 0; const int alen = a.length(), blen = b.length(); res = "0" + (alen > blen ? a : b); for (int i = alen-1, j = blen-1, k = res.length() - 1; i >= 0 || j >= 0 || add_bit > 0; --i, --j, --k){ sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit; add_bit = sum_value / 10; res[k] = sum_value%10 + '0'; } if (res[0] == '0') res = res.substr(1, res.length() - 1); return res; } string &_gen_zeros_string(int n, string &res) { string temp = "0"; res = ""; while (n) { if (n&1) res += temp; temp += temp; n >>= 1; } return res; } string &_string_multiply_char( const string &a, char c, int n_zeros, string &res) { int ch = c - '0'; string zeros_string; _gen_zeros_string(n_zeros, zeros_string); res = "0" + a + zeros_string; const int alen = a.length(); for (int i = alen - 1, k = alen, add_bit = 0; i >= 0 || add_bit > 0; --i, --k) { int v = (i>=0 ? a[i]-48: 0) * ch + add_bit; add_bit = v / 10; res[k] = v % 10 + '0'; } if (res[0] == '0') res = res.substr(1, res.length() - 1); return res; } string &_string_multiply_string(const string &a, const string &b, string &res) { string c = a, d = b; _del_zeros_before_dot(c); _del_zeros_before_dot(d); int clen = c.length(), dlen = d.length(); if (clen < dlen) { string t = c; c = d; d = t; int x = clen; clen = dlen; dlen = x; } res = "0"; for (int i = dlen - 1; i >= 0; --i) { string temp_res; _string_multiply_char(c, d[i], (dlen - 1 - i), temp_res); string add_res; _string_add_string(res, temp_res, add_res); res = add_res; } return res; }
4.除法
哥不会,没有好的想法
好像也不常用