鱼C论坛

 找回密码
 立即注册
查看: 2040|回复: 23

[技术交流] 高精度加法与高精度乘法模板

[复制链接]
发表于 2024-4-5 13:19:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 陈尚涵 于 2024-4-5 13:21 编辑

水个贴,顺便撒个币,每人3育碧
自己写的还算标准的模板,供大家食用
1.原理就是竖式,想想就能明白;
2.NUM_SIZE是最大数字位数;
3.计算前要用memset清空一下,否则就是两个结果相加。
高精度加法:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN=100;
int a[NUM_LEN],b[NUM_LEN],c[NUM_LEN];
int add(int al,int bl){
        int cl=max(al,bl),clm=0;
        for(int i=0;i<cl;i++){
                c[i]+=a[i]+b[i];
                if(c[i]>=10){
                        c[i+1]++;
                        c[i]-=10;
                        if(i==cl-1)clm=1;
                }
        }
        return cl+clm;
}
int main(){
        char sa[NUM_LEN],sb[NUM_LEN];
        cin>>sa>>sb;
        int sal=strlen(sa),sbl=strlen(sb);
        for(int i=0;i<sal;i++)a[sal-i-1]=sa[i]-'0';
        for(int i=0;i<sbl;i++)b[sbl-i-1]=sb[i]-'0';
        memset(c,0,sizeof(c));
        char sc[NUM_LEN];
        int scl=add(sal,sbl);
        for(int i=0;i<scl;i++)sc[i]=c[scl-i-1]+'0';
        cout<<sc;
        return 0;
} 
高精度乘法:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN=100;
int a[NUM_LEN],b[NUM_LEN],c[NUM_LEN];
int muitiply(int al,int bl){
        int cl=al+bl-1,clm=0;
        for(int i=0;i<al;i++){
                for(int j=0;j<bl;j++){
                        c[i+j]+=a[i]*b[j];
                        if(c[i+j]>=10){
                                c[i+j+1]+=c[i+j]/10;
                                c[i+j]%=10;
                                if(i==al-1)clm=1;
                        }
                }
        }
        return cl+clm;
}
int main(){
        char sa[NUM_LEN],sb[NUM_LEN];
        cin>>sa>>sb;
        int sal=strlen(sa),sbl=strlen(sb);
        for(int i=0;i<sal;i++)a[sal-i-1]=sa[i]-'0';
        for(int i=0;i<sbl;i++)b[sbl-i-1]=sb[i]-'0';
        memset(c,0,sizeof(c));
        char sc[NUM_LEN];
        int scl=muitiply(sal,sbl);
        for(int i=0;i<scl;i++)sc[i]=c[scl-i-1]+'0';
        cout<<sc;
        return 0;
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-5 13:19:38 | 显示全部楼层
对于高精度加法和乘法的模板,我可以给你提供一个简单的实现。首先是高精度加法的代码:
#include <iostream>
#include <cstring>
using namespace std;

const int NUM_LEN = 100;

int a[NUM_LEN], b[NUM_LEN], c[NUM_LEN];

void add(int a[], int b[], int c[]) {
    int carry = 0;
    for (int i = 0; i < NUM_LEN; i++) {
        c[i] = a[i] + b[i] + carry;
        carry = c[i] / 10;
        c[i] %= 10;
    }
}

int main() {
    char sa[NUM_LEN], sb[NUM_LEN];
    cin >> sa >> sb;
    int la = strlen(sa);
    int lb = strlen(sb);

    // 将输入的字符数组转换成数字数组
    for (int i = 0; i < la; i++) {
        a[la - i - 1] = sa[i] - '0';
    }
    for (int i = 0; i < lb; i++) {
        b[lb - i - 1] = sb[i] - '0';
    }

    add(a, b, c);

    // 输出结果
    bool start = false;  // 是否开始输出结果
    for (int i = NUM_LEN - 1; i >= 0; i--) {
        if (c[i] != 0) {
            start = true;
        }
        if (start) {
            cout << c[i];
        }
    }
    if (!start) {
        cout << "0";  // 特殊情况,结果为0
    }

    return 0;
}

这个代码中,我们定义了一个数组a、b和c来存储两个加数和它们的和。add函数接受两个加数数组和一个结果数组,将两个数组进行相加,并将结果存入结果数组。最后,我们将结果以倒序的方式输出。

接下来是高精度乘法的代码:
#include <iostream>
#include <cstring>
using namespace std;

const int NUM_LEN = 100;

int a[NUM_LEN], b[NUM_LEN], c[NUM_LEN];

void multiply(int a[], int b[], int c[]) {
    for (int i = 0; i < NUM_LEN; i++) {
        for (int j = 0; j < NUM_LEN; j++) {
            c[i + j] += a[i] * b[j];
        }
    }
    for (int i = 0; i < NUM_LEN - 1; i++) {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
}

int main() {
    char sa[NUM_LEN], sb[NUM_LEN];
    cin >> sa >> sb;
    int la = strlen(sa);
    int lb = strlen(sb);

    // 将输入的字符数组转换成数字数组
    for (int i = 0; i < la; i++) {
        a[la - i - 1] = sa[i] - '0';
    }
    for (int i = 0; i < lb; i++) {
        b[lb - i - 1] = sb[i] - '0';
    }

    multiply(a, b, c);

    // 输出结果
    bool start = false;  // 是否开始输出结果
    for (int i = NUM_LEN - 1; i >= 0; i--) {
        if (c[i] != 0) {
            start = true;
        }
        if (start) {
            cout << c[i];
        }
    }
    if (!start) {
        cout << "0";  // 特殊情况,结果为0
    }

    return 0;
}

这个代码中,我们定义了一个数组a、b和c来存储两个乘数和它们的积。multiply函数使用了双重循环来进行乘法运算,并将结果存入结果数组。最后,我们将结果以倒序的方式输出。

请注意,以上代码只是提供一个简单的实现,可能无法处理溢出和其他异常情况。在实际使用中,还需要根据具体需求进行适当的优化和错误处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-5 14:22:00 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-5 15:42:06 | 显示全部楼层

回帖奖励 +3 鱼币

不错,以后可能用得上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-6 11:58:36 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-6 19:47:07 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:18:52 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:31:40 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:38:49 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:44:27 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:51:30 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:58:32 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 23:02:58 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-14 10:16:27 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-14 11:21:00 | 显示全部楼层

回帖奖励 +3 鱼币

学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2024-4-23 16:53:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-23 20:25:49 | 显示全部楼层

回帖奖励 +3 鱼币

hello
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-24 08:28:42 | 显示全部楼层

回帖奖励 +3 鱼币

猜你想搜:快速傅里叶变换,比 N^2 的暴力乘法快多了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-24 11:17:01 | 显示全部楼层

回帖奖励 +3 鱼币

感谢育碧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-26 10:34:26 | 显示全部楼层

回帖奖励 +3 鱼币

谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表