高精度加法和乘法

高精度加法和乘法

加法(只支持自然数的大整数相加)

1.通过模拟加法算式,从右往左依次累加,如果两个不一样长,要在短的前面用0补上。

2.取余保留,除10进位,注意最后一位如果有进位要把进位加上去。

乘法(只支持自然数的大整数相乘)

1. 通过模拟乘法算式,从右往左数的话,s1[i] * s2[j] 贡献给了ans[i+j]。

2.所以为了方便从右往左数, 先把s1,s2翻转,且乘法后的结果最多有 len1+len2位。

3.因为s1[i] * s2[j] 和s1[j] * s2[i]都会贡献给ans[i+j],所以要写两层for循环。

4.贡献值 = 第一次贡献值 + 第二次贡献值,然后取余保留,除10进位。

5.最后得到结果,要找到非0的首位,并且要反过来,也要判断结果为0的时候,返回"0"。


    string add(string s1, string s2) {//模拟加法算式,从右往左加(只支持自然数相加)
        int len1 = s1.length(), len2 = s2.length();
        if (len1 < len2) {//位数不够用0补
            string t(len2 - len1, '0');
            s1 = t + s1;
        } else if (len2 < len1) {
            string t(len1 - len2, '0');
            s2 = t + s2;
        }
        string ans = s1;
        int car = 0;
        for (int i = s1.length() - 1; i >= 0; i--) {
            ans[i] = (s1[i] - '0' + s2[i] - '0' + car) % 10 + '0';
            car = (s1[i] - '0' + s2[i] - '0' + car) / 10;
        }
        if (car) ans = (char) (car + '0') + ans;//多出一位进位要加上
        return ans;
    
    }
    
    string mul(string s1, string s2) {//(只支持自然数相乘)
        vector<int> v(s1.length() + s2.length(), 0);
        reverse(s1.begin(), s1.end());//翻转便于计算,反转后从右往左,依次为个位、十位...
        reverse(s2.begin(), s2.end());
        for (int i = 0; i < s1.length(); i++) {
            for (int j = 0; j < s2.length(); j++) {
                int t = (s1[i] - '0') * (s2[j] - '0') + v[i + j];//
                v[i + j] = t % 10;//取余保留
                v[i + j + 1] += t / 10;//除10进位
            }
        }
        int i;
        for (i = v.size() - 1; v[i] == 0; i--);//取非0首位作为第一位
        string ans(i + 1, '0');
        for (int j = 0; j <= i; j++)//把结果再次反过来保存即可
            ans[j] = v[i - j] + '0';
        if (ans == "") ans = "0";//如果不存在非0首位,则答案为 "0"
        return ans;
    }
    



对于C语言中的高精度加法乘法,可以使用字符串或数组来实现。下面是一个简单的示例代码: ```c #include <stdio.h> #include <string.h> // 字符串形式的高精度加法 char* highPrecisionAdd(char* num1, char* num2) { int len1 = strlen(num1); int len2 = strlen(num2); int maxLen = (len1 > len2 ? len1 : len2) + 1; char* result = (char*)malloc((maxLen + 1) * sizeof(char)); // 申请足够的空间存放结果 result[maxLen] = '\0'; // 结果字符串结尾 int carry = 0; // 进位 int i = len1 - 1; int j = len2 - 1; int k = maxLen - 1; while (i >= 0 || j >= 0) { int n1 = (i >= 0 ? num1[i] - '0' : 0); int n2 = (j >= 0 ? num2[j] - '0' : 0); int sum = n1 + n2 + carry; result[k] = sum % 10 + '0'; // 计算当前位的值 carry = sum / 10; // 计算进位 i--; j--; k--; } if (carry > 0) { result[k] = carry + '0'; // 如果最高位有进位,需要在最前面加上 } else { // 去掉最高位的0 char* tmp = (char*)malloc(len1 + 1); strcpy(tmp, result + 1); free(result); result = tmp; } return result; } // 数组形式的高精度乘法 void highPrecisionMultiply(int num1[], int len1, int num2[], int len2, int result[]) { int maxLen = len1 + len2; for (int i = 0; i < maxLen; i++) { result[i] = 0; // 初始化结果数组为0 } for (int i = len1 - 1; i >= 0; i--) { for (int j = len2 - 1; j >= 0; j--) { int mul = num1[i] * num2[j]; int sum = result[i + j + 1] + mul; result[i + j] += sum / 10; result[i + j + 1] = sum % 10; } } } int main() { // 高精度加法示例 char num1[] = "123456789"; char num2[] = "987654321"; char* sum = highPrecisionAdd(num1, num2); printf("Sum: %s\n", sum); free(sum); // 高精度乘法示例 int num3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int num4[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int len1 = sizeof(num3) / sizeof(num3[0]); int len2 = sizeof(num4) / sizeof(num4[0]); int result[len1 + len2]; highPrecisionMultiply(num3, len1, num4, len2, result); printf("Product: "); for (int i = 0; i < len1 + len2; i++) { printf("%d", result[i]); } printf("\n"); return 0; } ``` 以上代码示例了如何使用字符串数组来实现高精度加法乘法。其中,高精度加法使用字符串存储数字,逐位相加,并处理进位。高精度乘法使用数组存储数字,按照乘法规则逐位计算,并将结果保存在结果数组中。运行以上示例代码,可以得到高精度加法乘法的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值