P1136高精度乘法

复制代码
#include<iostream> 
#include<cstring>
using namespace std;
//将字符串每一位改为数字,再反向计算,最后处理进位问题。 
int main() {
    char a[101], b[101];       //定义字符数组是为了好测量,输入的长度
    while (cin >> a >> b) {
        char swap[101];         //用来进行交换的,超过a的长度小于b的长度
        int a1[101] = { 0 }, b1[101] = { 0 };  //接受a与b的,并将其转化为整形数组和反转
        int lena1, lenb1;      //测量a与b的长度
        lena1 = strlen(a), lenb1 = strlen(b);
        int n;                 //接受lena1与lena2的最大值,并且为下面的动态数组做准备
        n = (lena1 > lenb1 ? lena1 : lenb1);
        //申请动态数组,a与b的乘积最多有2*n位数
        int *p;
        p = new int[2 * n];
        //将p数组清零
        memset(p, 0, sizeof(int)*(2 * n));
        //控制b1为最短的数组
        if (lena1 < lenb1) {
            strcpy(swap, b);
            strcpy(b, a);
            strcpy(a, swap);
        }
        lena1 = strlen(a), lenb1 = strlen(b);
        //反转a数组
        for (int i1 = lena1 - 1; i1 >= 0; i1--) {
            a1[lena1-1-i1] = a[i1] - '0';
        }
        //反转数组b
        for (int k1 = lenb1 - 1; k1 >= 0; k1--) {
            b1[lenb1 - 1 - k1] = b[k1] - '0';
        }
        int len;    //控制p数组从第几位开始
        for (int i = 0; i < lenb1; i++) { 
            len = i;
            for (int k = 0; k < lena1; k++) {
                p[len] += b1[i] * a1[k];
                if (p[len] > 9) {
                    p[len + 1] += p[len] / 10;
                    p[len] = p[len] % 10;
                }
                len++;
            }
        }
        while (p[len] == 0) {
            len--;
        }
        for (int k2 = len ; k2 >= 0; k2--) {
            cout << p[k2];
        }
        delete[]p;
        cout << endl;
    }
    return 0;
}
复制代码

 

posted @   刘海烽  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示