可以知道在处理高精度乘法的时候,我们是不考虑当场进位的,在所有位数都模拟完竖式乘法后才进行逐位进位,这就要求存储每个位的数组保证不会爆掉溢出

众所周知char类型最多只能存储到255,非常非常容易溢出成负数,对于char型数组要考虑每一步乘法都要进位。

而int型数组最大21亿就不用考虑这种问题,当然是在内存允许的前提下

P1045 [NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),举个例子

这道题要求高精度的乘法,我一开始开的就是char型数组,当输入P较小时尚可,当P超过50时就会爆负数,我真的会谢,找了半天没找到问题,最终发觉应该是char型变量爆了,随后改为int就好了

如图

void Big_Multiple(char A[], char B[], int* lena, int lenb)
{
char C[1000000]={0};
for (int i = 0; i < *lena; i++)
{
for (int j = 0; j < lenb; j++)
{
C[i + j] += A[i] * B[j];
}
}
int lenc = *lena + lenb - 1;
int last = 0;
for (int i = 0; i < lenc; i++)
{
int Temp = C[i] + last;
C[i] = Temp % 10;
last = Temp / 10;
}
while (last)
{
C[lenc++] = last % 10;
last /= 10;
}
for (int i = 0; i < lenc; i++)
A[i] = C[i];
*lena = lenc;
}

char型数组,结果如下

(算的是2的P次方,用了快速幂),可以看到当P大于30就开始爆负数了

下面是改为int后的

void Big_Multiple(int A[], int B[], int* lena, int lenb)
{
int C[1000000]={0};
for (int i = 0; i < *lena; i++)
{
for (int j = 0; j < lenb; j++)
{
C[i + j] += A[i] * B[j];
}
}
int lenc = *lena + lenb - 1;
int last = 0;
for (int i = 0; i < lenc; i++)
{
int Temp = C[i] + last;
C[i] = Temp % 10;
last = Temp / 10;
}
while (last)
{
C[lenc++] = last % 10;
last /= 10;
}
for (int i = 0; i < lenc; i++)
A[i] = C[i];
*lena = lenc;
}

可以看到即使P为10000还没爆负数,完美

当然不难发现我们并不需要将所有数组都开成int型,只有一个数组需要为int型那就是高精度乘法时接受加和的那个数组,其他数组为char型即可

void Big_Multiple(char A[], char B[], int* lena, int lenb)
{
int C[1000000]={0};//就是这个数组需要设为int型,其他数组设为char型即可
for (int i = 0; i < *lena; i++)
{
for (int j = 0; j < lenb; j++)
{
C[i + j] += A[i] * B[j];
}
}
int lenc = *lena + lenb - 1;
int last = 0;
for (int i = 0; i < lenc; i++)
{
int Temp = C[i] + last;
C[i] = Temp % 10;
last = Temp / 10;
}
while (last)
{
C[lenc++] = last % 10;
last /= 10;
}
for (int i = 0; i < lenc; i++)
A[i] = C[i];
*lena = lenc;
}

关于大数乘法的数组类型问题(int 还是char)的更多相关文章

  1. hdu_1042(模拟大数乘法)

    计算n! #include<cstring> #include<cstdio> using namespace std; ]; int main() { int n; whil ...

  2. HDOJ-1042 N!(大数乘法)

    http://acm.hdu.edu.cn/showproblem.php?pid=1042 题意清晰..简单明了开门见山的大数乘法.. 10000的阶乘有35000多位 数组有36000够了 # i ...

  3. PAT 1023 Have Fun with Numbers[大数乘法][一般]

    1023 Have Fun with Numbers (20)(20 分) Notice that the number 123456789 is a 9-digit number consistin ...

  4. 大数乘法的C代码实现

    在C语言中,宽度最大的无符号整数类型是unsigned long long, 占8个字节.那么,如果整数超过8个字节,如何进行大数乘法呢? 例如: $ python Python 2.7.6 (def ...

  5. 算法提高 P1001【大数乘法】

    当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果 ...

  6. 最短的计算大数乘法的c程序

    #include <stdio.h> char s[99],t[99]; int m,n; void r(int i,int c) { int j=0,k=i; while(k)c+=s[ ...

  7. 大数乘法(A * B Problem Plus)问题

    大数乘法问题一般可以通过将大数转换为数组来解决. 解题思路 第1步 第2步 第3步 第4步 样例输入1 56 744 样例输出1 800 样例输入2 -10 678 样例输出2 -6780 样例输入3 ...

  8. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  9. 51nod 1027大数乘法

    题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...

  10. [POJ] #1001# Exponentiation : 大数乘法

    一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: ...

随机推荐

  1. python生成word文档

    python生成word文档,感觉比java生成方便很多 下面看看步骤 1.环境 pip install python-docx 2.准备一张需要插入word中的图片monty-truth.png 3 ...

  2. poj 3268 最短路

    ***题意:在x这个点有个聚会,其他的点要到x这个点,然后再会自己原始的点,求一来一回最大的那个距离 做法:两边dijstra算法,因为是单向图,要注意更新顺序*** #include<iost ...

  3. java进阶(27)--HashSet与TreeSet

    一.HashSet: 1.特点:无序不可重复,实际上为放入HashMap中的key部分. 2.举例说明:

  4. Vue第四篇 Vue路由系统

    01-路由注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. RLHF · PbRL | QPA:选择 near on-policy query,加速 policy learning 收敛速度

    论文题目:Query-Policy Misalignment in Preference-Based Reinforcement Learning,ICLR 2023 Spotlight(8 6 6) ...

  6. Laravel - 配置 数据库

  7. JMS微服务开发示例(三)使用分布式锁和编写定时任务

    分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...

  8. [转帖]Oracle JDBC中的语句缓存

    老熊 Oracle性能优化 2013-09-13 在Oracle数据库中,SQL解析有几种: 硬解析,过多的硬解析在系统中产生shared pool latch和library cache liatc ...

  9. [转帖]文件操作之zip、bzip2、gzip、tar命令

    文件操作之zip.bzip2.gzip.tar命令 原创 丁同学19902015-10-15 00:02:51博主文章分类:liunx基础著作权 文章标签linux tarlinux文件压缩linux ...

  10. [转帖]VMWare ESXi中,不同的虚拟网卡性能竟然能相差三倍!

    https://zhuanlan.zhihu.com/p/525656364 正文共:1024 字 11 图,预估阅读时间:1 分钟 在上个实验中(VPP使用DPDK纳管主机网卡),我们已经初步实现了 ...