题目描述
对一道A+B的题目,如果A和B的范围在int范围内,那么相信大家很快就能写出程序。但是如果A和B是有着1000个数位的整数,恐怕就没有办法用已有的数据类型来表示了,这时就只能老实去模拟加减乘除的过程。
解题思路:
使用数组来存储整数字符串,然后低位存放低位,高位存放高位
在进行大整数加减运算的时候,
若出现负数,则在最后输出的时候,添加负号即可
#include<iostream>
using namespace std;
#include<string>
struct bign
{
int d[1000];
int len;
bign() {
memset(d,0,sizeof(d));
len = 0;
}
};
bign change(string str) {//将整数转换为bign
bign big;
int len = str.size();
big.len = len;
for (int i = 0; i < len; i++) {
big.d[i] = str[len - i - 1] - '0';//将str数组高位放在bign数组的高位
}
return big;
}
int compare(bign b1,bign b2) {//比较大小
if (b1.len > b2.len) {
return 1;
}
else if (b1.len < b2.len) {
return -1;
}
else
{
for (int i = b1.len - 1; i >= 0; i--) {//从高位往地位比较
if (b1.d[i] > b2.d[i]) {
return 1;
}
else
{
return -1;
}
}
}
return 0;
}
bign add(bign b1,bign b2) {//加法,默认正整数
bign big;
int carry = 0;//表示进位
for (int i = 0; i < b1.len || i < b2.len; i++) {
int temp = b1.d[i] + b2.d[i] + carry;
big.d[big.len++] = temp % 10;
carry = temp / 10;
}
if (carry != 0) {
big.d[big.len++] = carry;//进位不为零,直接加到最高位
}
return big;
}
bign sub(bign b1,bign b2) {//减法,默认都为正整数且b1 > b2
bign big;
int carry = 0;//借位:0表示不借位,1表示借位
for (int i = 0; i < b1.len || i < b2.len; i++) {
if (b2.d[i] <= b1.d[i] - carry) {//当前位够减
big.d[big.len++] = b1.d[i] - carry - b2.d[i];
carry = 0;
}
else//当前位不够减
{
big.d[big.len++] = b1.d[i] - carry + 10 - b2.d[i];
carry = 1;
}
}
while (big.len >= 1 && big.d[big.len - 1] == 0)//去掉最高位的0
{
big.len--;
}
return big;
}
//高精度与低精度的乘法
bign multi(bign b,int num) {
bign big;
int carry = 0;//进位
for (int i = 0; i < b.len; i++) {
int temp = b.d[i] * num + carry;
big.d[big.len++] = temp % 10;
carry = temp / 10;
}
while (carry != 0)//乘法可能有多位进位
{
big.d[big.len++] = carry % 10;
carry /= 10;
}
return big;
}
//高精度与低精度除法
bign divide(bign b, int num, int& r) {//r为余数
bign big;
big.len = b.len;//商的位数与被除数的位数相同
for (int i = b.len - 1; i >= 0; i--) {
r = r * 10 + b.d[i];//每一次新的被除数
if (r < num) {//不够除
big.d[i] = 0;
}
else {//够除
big.d[i] = r / num;
r = r % num;//新的余数
}
}
//去掉高位的零
while (big.len - 1 >= 1 && big.d[big.len-1] == 0)//保证结果至少有一位
{
big.len--;
}
return big;
}
void printBign(bign big) {
for (int i = big.len - 1; i >= 0; i--) {
cout << big.d[i];
}
cout << endl;
}
//大整数的四则运算
int main() {
//string str1,str2;
//cin >> str1 >> str2;
string str1;
int num;
cin >> str1 >> num;
bign b1 = change(str1);
//bign b2 = change(str2);
//bign big = add(b1,b2);
//bign big = sub(b1,b2);
//bign big = multi(b1,num);
int r = 0;
bign big = divide(b1,num,r);
printBign(big);
cout << "余数为:" << r << endl;
system("pause");
return 0;
}