高精度

高精度

加减乘除

#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10; // 定义最大数字长度

char s[N], t[N]; // 存储输入的两个大整数字符串
int a[N], b[N], c[N]; // 存储大整数的数组

// 函数:将两个大整数相加,结果存储在c中
void add(int a[], int b[], int c[], int lena, int lenb) {
    int n = max(lena, lenb); // 获取两个数组的最大长度
    for (int i = 1; i <= n; i++) {
        c[i] += a[i] + b[i]; // 逐位相加
        if (c[i] >= 10) { // 处理进位
            c[i + 1]++;
            c[i] -= 10;
        }
    }
    // 处理最后的进位
    if (c[n] >= 10) {
        c[n] -= 10;
        c[n + 1]++;
        n++;
    }
    for (int i = n; i >= 1; i--) {
        cout << c[i]; // 倒序输出结果
    }
}

// 函数:比较两个大整数的大小
bool pd(int a[], int b[], int lena, int lenb) {
    if (lena == lenb) {
        for (int i = 1; i <= lena; i++) {
            if (a[i] != b[i]) {
                return a[i] > b[i]; // 从最高位开始比较
            }
        }
        return true; // 两个数相等
    }
    return lena > lenb; // 长度不同,较长的数较大
}

// 函数:计算两个大整数的差,结果存储在c中
void jian(int a[], int b[], int c[], int lena, int lenb) {
    bool op = pd(a, b, lena, lenb); // 判断哪个数较大
    if (!op) {
        // 如果a小于b,交换a和b
        int t[N];
        for (int i = 1; i <= lena; i++) {
            t[i] = a[i];
        }
        for (int i = 1; i <= lenb; i++) {
            a[i] = b[i];
        }
        for (int i = lenb + 1; i <= lena; i++) a[i] = 0;
        for (int i = 1; i <= lena; i++) {
            b[i] = t[i];
        }
        for (int i = lena + 1; i <= lenb; i++) b[i] = 0;
        swap(lena, lenb); // 交换长度
    }
    int n = max(lena, lenb);
    bool f = false;
    for (int i = 1; i <= n; i++) {
        if (f) {
            c[i] = a[i] - b[i] - 1;
            f = false;
        } else {
            c[i] = a[i] - b[i];
        }
        if (c[i] < 0) {
            c[i] += 10;
            f = true; // 处理借位
        }
    }
    while (n > 1 && c[n] == 0) {
        n--; // 去除前导零
    }
    if (!op) {
        cout << '-'; // 如果a小于b,输出负号
    }
    for (int i = n; i >= 1; i--) {
        cout << c[i]; // 倒序输出结果
    }
}

// 函数:计算两个大整数的乘积,结果存储在c中
void cheng(int a[], int b[], int c[], int lena, int lenb) {
    for (int i = 1; i <= lena; i++) {
        for (int j = 1; j <= lenb; j++) {
            c[i + j - 1] += a[i] * b[j]; // 逐位相乘
        }
    }
    int n = lena + lenb;
    for (int i = 1; i <= n; i++) {
        c[i + 1] += c[i] / 10; // 处理进位
        c[i] %= 10;
    }
    while (n > 1 && c[n] == 0) {
        n--; // 去除前导零
    }
    for (int i = n; i >= 1; i--) {
        cout << c[i]; // 倒序输出结果
    }
}

// 函数:计算一个大整数除以一个整数的商,结果存储在c中
void chu(int a[], int b, int c[], int lena) {
    int r = 0; // 存储余数
    for (int i = lena; i >= 1; i--) {
        r *= 10;
        r += a[i];
        c[i] = r / b; // 计算商
        r %= b; // 计算余数
    }
    while (lena > 1 && c[lena] == 0) {
        lena--; // 去除前导零
    }
    for (int i = lena; i >= 1; i--) {
        printf("%d", c[i]); // 倒序输出结果
    }
    printf("\n%d", r); // 输出余数
}

int main() {
    // 读取两个大整数
    scanf("%s%s", s + 1, t + 1);
    int lens = strlen(s + 1);
    int lent = strlen(t + 1);
    for (int i = lens; i >= 1; i--) {
        a[i] = s[lens - i + 1] - '0'; // 将字符串转换为数组
    }
    for (int i = lent; i >= 1; i--) {
        b[i] = t[lent - i + 1] - '0'; // 将字符串转换为数组
    }

    // 调用加法函数进行计算
    add(a, b, c, lens, lent);




   //除 
//	int x;
//	scanf("%s %d",s+1,&x);
//	int lens=strlen(s+1);
//	for(int i=lens;i>=1;i--)
//	{
//		a[i]=s[lens-i+1]-'0';
//	}
//	chu(a,x,c,lens);
    return 0;
}

这段代码包含了大整数的加法、减法、乘法和除法运算,每个函数都有详细的注释,解释了主要的逻辑和步骤。希望这能帮助你更好地理解和分享这段代码!

posted @ 2024-10-17 16:16  闫柏军  阅读(40)  评论(0)    收藏  举报