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

众所周知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. SAE 最佳实践范本:助力视野数科进入云原生“快车道”

    阿里云生态金融科技行业标杆 -- ​ 2021 年,云原生的商业价值正在被加速释放. ​ 一个公认的事实是,Serverless 是当下云原生方向内绝对的亮点.可以看作,它的出现,让企业用户真正地免除 ...

  2. element-ui 实现行合并-亲测有效!

    目标样式: 首先先来看下我们拿到的返回数据: scheduleList: [ { date: '第一天', journey: '报道', lecturer: '', }, { date: '第二天', ...

  3. d3生成器--line,area,diagonal

    https://blog.csdn.net/qq_31396185/article/details/78147612

  4. zzuli 1023

    java 读入单个字符 import java.util.Scanner; public class Main{ public static void main(String args[]){ Sca ...

  5. 解决navicat连接mysql数据库查询很慢的问题

    1.背景: navicat连接数据库进行sql查询,每隔一段时间发现查询会变得很慢 2.原因: Mysql服务器端会定时清理长时间不活跃空闲的数据库连接,进行优化 3.解决方案: Navicat -右 ...

  6. JUC包常用类原理

    放眼望去,java.util.concurrent包下类大致包括:atomic 原子类.锁.并发集合.线程池.工具类.我们挑重要的了解一下. Atomic 原子类 Java针对并发编程已经有了各种锁, ...

  7. Tmux | 常用操作存档

    (因为自己实在是太好忘了,所以在博客存档方便查找) 参考资料:Tmux 使用教程 | 阮一峰的网络日志 tmux new -s <session-name> <Ctrl+B D> ...

  8. mysql 复制表结构创建表及复制表结构与数据创建表

    本文为博主原创,未经允许不得转载: 在开发过程或项目维护发布过程中,经常需要复制建表及复制表数据建表等,整理了以下四种常用的 mysql 命令. 1.  create like 复制表结构(包含索引, ...

  9. 8. exporter

    一.已经实现的收集器 1.1 可收集的内存指标 1.2 可收集的jetty指标 二.自定义收集 2.1 summer 2.2 histogram 三.架构设计 exporter作为Prometheus ...

  10. HanLP — 感知机(Perceptron)

    感知机(Perceptron)是一个二类分类的线性分类模型,属于监督式学习算法.最终目的: 将不同的样本分本 感知机饮食了多个权重参数,输入的特征向量先是和对应的权重相乘,再加得到的积相加,然后将加权 ...