整数
加法
模拟高精度加法运算
将数据存放在字符串里,然后反向存放到数组中,再对应下标操作进位,反向存放的目的就在于数组往后扩张更方便,往前无法扩张就得移动整个数组
附Euler-13代码
#include#include using namespace std; char str1[55], str2[55]; int num1[55], num2[55], sum[55]; int main() { num1[0] = 50; sum[0] = 50; int i, j; while(cin >> str1) { //num1[0] = strlen(str1); //num2[0] = strlen(str2); for(i = 0, j = num1[0]; i < num1[0]; ++i, --j) num1[j] = str1[i] - '0'; //for(i = 0, j = num2[0]; i < num2[0]; ++i, --j) // num2[j] = str2[i] - '0'; //sum[0] = max(num1[0], num2[0]); for(i = 1; i <= sum[0]; ++i){ sum[i] += num1[i]; //+ num2[i]; if (sum[i] > 9){ sum[i + 1] += sum[i] / 10; sum[i] %= 10; if(i == sum[0]) ++sum[0]; } } } for (i = 0, j = sum[0]; i < 10; ++i, --j) cout << sum[j]; cout << endl; return 0; }
乘法
模拟乘法运算
将每一位相乘的结果累加,注意移位,画图模拟就懂了
附代码
#include#include using namespace std; int num1[1005], num2[1005], sum[1005]; char str1[1005], str2[1005]; int main () { cin >> str1 >> str2; num1[0] = strlen(str1); num2[0] = strlen(str2); int i, j; for(i = 0, j = num1[0]; i < num1[0]; ++i, --j) num1[j] = str1[i] - '0'; for(i = 0, j = num2[0]; i < num2[0]; ++i, --j) num2[j] = str2[i] - '0'; for(i = num1[0]; i > 0; --i) cout << num1[i]; cout << endl; for(i = num2[0]; i > 0; --i) cout << num2[i]; cout << endl; sum[0] = num1[0] + num2[0] - 1; for(i = 1; i <= num2[0]; ++i){ for(j = 1; j <= num1[0]; ++j){ sum[j + i - 1] += num2[i] * num1[j]; if (sum[j + i - 1] > 10){ sum[j + i] += sum[j + i - 1] / 10; sum[j + i - 1] %= 10; if (j + i - 1 == sum[0]) ++sum[0]; } } } for(i = sum[0]; i > 0; --i) cout << sum[i]; cout << endl; return 0; }
减法
模拟减法运算
封装判断大整数大小的函数,判断两数大小,保证大减小,如果小减大,就大减小再最后输出一个负号,这样就避免单位计算出现借位负数,以及长度问题
除法
模拟除法运算
有一个待除数的概念,封装判断大整数大小的函数
1.建立大循环,根据除数的位数来跳转被除数的坐标,如果越界,直接返回商值
2.例如:除数有4位,直接从被除数第4位开始计算待除数,先比较大小,如果小于除数,待除数再加一位,然后开始大数减法循环,循环更新条件:待除数 -= 除数,++商值;循环终止条件:待除数 < 除数;得到剩余的待除数和商值
3.判断待除数的位数,然后重复1步骤和2步骤,最后输出商值



