陈尚涵 发表于 2024-4-5 13:19:05

高精度加法与高精度乘法模板

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

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

FishC 发表于 2024-4-5 13:19:38

对于高精度加法和乘法的模板,我可以给你提供一个简单的实现。首先是高精度加法的代码:

#include <iostream>
#include <cstring>
using namespace std;

const int NUM_LEN = 100;

int a, b, c;

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

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

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

    add(a, b, c);

    // 输出结果
    bool start = false;// 是否开始输出结果
    for (int i = NUM_LEN - 1; i >= 0; i--) {
      if (c != 0) {
            start = true;
      }
      if (start) {
            cout << c;
      }
    }
    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, b, c;

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 += a * b;
      }
    }
    for (int i = 0; i < NUM_LEN - 1; i++) {
      c += c / 10;
      c %= 10;
    }
}

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

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

    multiply(a, b, c);

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

    return 0;
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

tommyyu 发表于 2024-4-5 14:22:00

{:10_275:}

liuhongrun2022 发表于 2024-4-5 15:42:06

不错,以后可能用得上

sfqxx 发表于 2024-4-6 11:58:36

{:5_108:}

琅琊王朝 发表于 2024-4-6 19:47:07

{:5_106:}

ZZxxccvvbbnnmm 发表于 2024-4-13 22:18:52

谢谢

QQQAAAXXX 发表于 2024-4-13 22:31:40

谢谢

LLkkjjhhggffdds 发表于 2024-4-13 22:38:49

谢谢

MMnnbbvvccxxzz 发表于 2024-4-13 22:44:27

学习

AAssddffgghhjjk 发表于 2024-4-13 22:51:30

学习

Mnklpo 发表于 2024-4-13 22:58:32

学习

Poklmn 发表于 2024-4-13 23:02:58

学习

PPooiiuuyyttrre 发表于 2024-4-14 10:16:27

学习

zhengtn03 发表于 2024-4-14 11:21:00

学习一下

ZZxxccvvbbnnmm 发表于 2024-4-23 16:53:38

学习

harryhan123 发表于 2024-4-23 20:25:49

hello

zhangjinxuan 发表于 2024-4-24 08:28:42

猜你想搜:快速傅里叶变换,比 N^2 的暴力乘法快多了。

尹玄睿 发表于 2024-4-24 11:17:01

感谢育碧!

myd0311 发表于 2024-4-26 10:34:26

谢谢分享
页: [1] 2
查看完整版本: 高精度加法与高精度乘法模板