鱼C论坛

 找回密码
 立即注册
查看: 246|回复: 20

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

[复制链接]
回帖奖励 6 鱼币 回复本帖可获得 3 鱼币奖励! 每人限 1 次
发表于 2024-4-5 13:19:05 | 显示全部楼层 |阅读模式

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

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

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

水个贴,顺便撒个币,每人3育碧
自己写的还算标准的模板,供大家食用
1.原理就是竖式,想想就能明白;
2.NUM_SIZE是最大数字位数;
3.计算前要用memset清空一下,否则就是两个结果相加。
高精度加法:
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int NUM_LEN=100;
  5. int a[NUM_LEN],b[NUM_LEN],c[NUM_LEN];
  6. int add(int al,int bl){
  7.         int cl=max(al,bl),clm=0;
  8.         for(int i=0;i<cl;i++){
  9.                 c[i]+=a[i]+b[i];
  10.                 if(c[i]>=10){
  11.                         c[i+1]++;
  12.                         c[i]-=10;
  13.                         if(i==cl-1)clm=1;
  14.                 }
  15.         }
  16.         return cl+clm;
  17. }
  18. int main(){
  19.         char sa[NUM_LEN],sb[NUM_LEN];
  20.         cin>>sa>>sb;
  21.         int sal=strlen(sa),sbl=strlen(sb);
  22.         for(int i=0;i<sal;i++)a[sal-i-1]=sa[i]-'0';
  23.         for(int i=0;i<sbl;i++)b[sbl-i-1]=sb[i]-'0';
  24.         memset(c,0,sizeof(c));
  25.         char sc[NUM_LEN];
  26.         int scl=add(sal,sbl);
  27.         for(int i=0;i<scl;i++)sc[i]=c[scl-i-1]+'0';
  28.         cout<<sc;
  29.         return 0;
  30. }
复制代码

高精度乘法:
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int NUM_LEN=100;
  5. int a[NUM_LEN],b[NUM_LEN],c[NUM_LEN];
  6. int muitiply(int al,int bl){
  7.         int cl=al+bl-1,clm=0;
  8.         for(int i=0;i<al;i++){
  9.                 for(int j=0;j<bl;j++){
  10.                         c[i+j]+=a[i]*b[j];
  11.                         if(c[i+j]>=10){
  12.                                 c[i+j+1]+=c[i+j]/10;
  13.                                 c[i+j]%=10;
  14.                                 if(i==al-1)clm=1;
  15.                         }
  16.                 }
  17.         }
  18.         return cl+clm;
  19. }
  20. int main(){
  21.         char sa[NUM_LEN],sb[NUM_LEN];
  22.         cin>>sa>>sb;
  23.         int sal=strlen(sa),sbl=strlen(sb);
  24.         for(int i=0;i<sal;i++)a[sal-i-1]=sa[i]-'0';
  25.         for(int i=0;i<sbl;i++)b[sbl-i-1]=sb[i]-'0';
  26.         memset(c,0,sizeof(c));
  27.         char sc[NUM_LEN];
  28.         int scl=muitiply(sal,sbl);
  29.         for(int i=0;i<scl;i++)sc[i]=c[scl-i-1]+'0';
  30.         cout<<sc;
  31.         return 0;
  32. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. const int NUM_LEN = 100;

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

  6. void add(int a[], int b[], int c[]) {
  7.     int carry = 0;
  8.     for (int i = 0; i < NUM_LEN; i++) {
  9.         c[i] = a[i] + b[i] + carry;
  10.         carry = c[i] / 10;
  11.         c[i] %= 10;
  12.     }
  13. }

  14. int main() {
  15.     char sa[NUM_LEN], sb[NUM_LEN];
  16.     cin >> sa >> sb;
  17.     int la = strlen(sa);
  18.     int lb = strlen(sb);

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

  26.     add(a, b, c);

  27.     // 输出结果
  28.     bool start = false;  // 是否开始输出结果
  29.     for (int i = NUM_LEN - 1; i >= 0; i--) {
  30.         if (c[i] != 0) {
  31.             start = true;
  32.         }
  33.         if (start) {
  34.             cout << c[i];
  35.         }
  36.     }
  37.     if (!start) {
  38.         cout << "0";  // 特殊情况,结果为0
  39.     }

  40.     return 0;
  41. }
复制代码


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

接下来是高精度乘法的代码:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. const int NUM_LEN = 100;

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

  6. void multiply(int a[], int b[], int c[]) {
  7.     for (int i = 0; i < NUM_LEN; i++) {
  8.         for (int j = 0; j < NUM_LEN; j++) {
  9.             c[i + j] += a[i] * b[j];
  10.         }
  11.     }
  12.     for (int i = 0; i < NUM_LEN - 1; i++) {
  13.         c[i + 1] += c[i] / 10;
  14.         c[i] %= 10;
  15.     }
  16. }

  17. int main() {
  18.     char sa[NUM_LEN], sb[NUM_LEN];
  19.     cin >> sa >> sb;
  20.     int la = strlen(sa);
  21.     int lb = strlen(sb);

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

  29.     multiply(a, b, c);

  30.     // 输出结果
  31.     bool start = false;  // 是否开始输出结果
  32.     for (int i = NUM_LEN - 1; i >= 0; i--) {
  33.         if (c[i] != 0) {
  34.             start = true;
  35.         }
  36.         if (start) {
  37.             cout << c[i];
  38.         }
  39.     }
  40.     if (!start) {
  41.         cout << "0";  // 特殊情况,结果为0
  42.     }

  43.     return 0;
  44. }
复制代码


这个代码中,我们定义了一个数组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
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 01:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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