高精度加法与高精度乘法详解

目录

1.两数之和(高精度)

2.两数相乘(高精度)


1.两数之和(高精度)

题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式

分两行输入。a,b≤10^{500}

输出格式

输出只有一行,代表a+b的值

#include<bits/stdc++.h>
using namespace std;
int main(){
    char a[100001], b[100001];//将数字以字符数组的形式输入
    cin>>a>>b;
    int jw = 0, n1, n2, maxn;//maxn为输入的两个数中位数更大的位数
    int aa[100001], bb[100001];
    n1 = strlen(a);//n1为输入的第一个数的位数
    n2 = strlen(b);//n2为输入的第二个数的位数
    for(int i = 0;i<n1;i++){
        aa[i] = a[n1-i-1]-'0';//将存入的第一个数以整形数组的形式存储,各个数位对应整型数组的各个值
    }
    for(int i = 0;i<n2;i++){
        bb[i] = b[n2-i-1]-'0';//将存入的第二个数以整型数组的形式存储,各个数位对应整型数组的各个值
    }
    if(n1>n2)
        maxn = n1;
    else
        maxn = n2;
    int sum[maxn];
    for(int i = 0;i<maxn;i++){
        sum[i] = aa[i]+bb[i]+jw;
        jw = sum[i]/10;
        sum[i] = sum[i]%10;
    }
    if(jw==1)
        cout<<jw;//若最高位有进位,单独数位最高的进位值,及和的最高位
    for(int i = maxn-1;i>=0;i--){
        cout<<sum[i];
    }
}

2.两数相乘(高精度)

题目描述

求两数的积。

输入格式

两行,两个整数。每个数字不超过 10^{2000},需用高精。

输出格式

一行一个整数表示乘积。

找规律,当相乘各数位不存在进位时:

 当数位存在进位时:

 c[k] = a[i]*b[j],其中k= i+j,用二重for循环实现遍历

#include<bits/stdc++.h>
using namespace std;
int main(){
    char a[100001], b[100001];//将数字以字符数组的形式输入
    cin>>a>>b;
    int aa[100001],bb[100001];
    int jw = 0, n1, n2, flag = 0;
    n1 = strlen(a);//n1为输入的第一个数的位数
    n2 = strlen(b);//n2为输入的第一个数的位数
    for(int i = 0;i<n1;i++){
        aa[i] = a[n1-i-1]-'0';//将存入的第一个数以整形数组的形式存储,各个数位对应整型数组的各个值
    }
    for(int i = 0;i<n2;i++){
        bb[i] = b[n2-i-1]-'0';//将存入的第二个数以整形数组的形式存储,各个数位对应整型数组的各个值
    }
    int maxn = n1+n2-1;
    int c[maxn];
    memset(c,0,sizeof(c));//将数组值全部初始化为0
    for(int i = 0;i<n1;i++){
        for(int j = 0;j<n2;j++){
            c[i+j] = c[i+j]+aa[i]*bb[j];//不进位时乘积各个位数的值
        }
    }
    for(int i = 0;i<maxn;i++){//进位操作
            c[i] = c[i]+jw;
            jw = c[i]/10;
            c[i] = c[i]%10;
    }
    if(jw!=0)
        cout<<jw;
    for(int i = maxn-1;i>=0;i--){
        if(c[i]!=0||i==0)//计算出来的乘积最高数位不能为0,除非最后一位为0
            flag = 1;
        if(flag == 1)
            cout<<c[i];
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_52254591/article/details/125509405