关于大数乘法的数组类型问题(int 还是char)
可以知道在处理高精度乘法的时候,我们是不考虑当场进位的,在所有位数都模拟完竖式乘法后才进行逐位进位,这就要求存储每个位的数组保证不会爆掉溢出
众所周知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)的更多相关文章
- hdu_1042(模拟大数乘法)
计算n! #include<cstring> #include<cstdio> using namespace std; ]; int main() { int n; whil ...
- HDOJ-1042 N!(大数乘法)
http://acm.hdu.edu.cn/showproblem.php?pid=1042 题意清晰..简单明了开门见山的大数乘法.. 10000的阶乘有35000多位 数组有36000够了 # i ...
- PAT 1023 Have Fun with Numbers[大数乘法][一般]
1023 Have Fun with Numbers (20)(20 分) Notice that the number 123456789 is a 9-digit number consistin ...
- 大数乘法的C代码实现
在C语言中,宽度最大的无符号整数类型是unsigned long long, 占8个字节.那么,如果整数超过8个字节,如何进行大数乘法呢? 例如: $ python Python 2.7.6 (def ...
- 算法提高 P1001【大数乘法】
当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果 ...
- 最短的计算大数乘法的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[ ...
- 大数乘法(A * B Problem Plus)问题
大数乘法问题一般可以通过将大数转换为数组来解决. 解题思路 第1步 第2步 第3步 第4步 样例输入1 56 744 样例输出1 800 样例输入2 -10 678 样例输出2 -6780 样例输入3 ...
- 蓝桥杯算法提高 P1001(大数乘法)
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...
- 51nod 1027大数乘法
题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...
- [POJ] #1001# Exponentiation : 大数乘法
一. 题目 Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 156373 Accepted: ...
随机推荐
- SAE 最佳实践范本:助力视野数科进入云原生“快车道”
阿里云生态金融科技行业标杆 -- 2021 年,云原生的商业价值正在被加速释放. 一个公认的事实是,Serverless 是当下云原生方向内绝对的亮点.可以看作,它的出现,让企业用户真正地免除 ...
- element-ui 实现行合并-亲测有效!
目标样式: 首先先来看下我们拿到的返回数据: scheduleList: [ { date: '第一天', journey: '报道', lecturer: '', }, { date: '第二天', ...
- d3生成器--line,area,diagonal
https://blog.csdn.net/qq_31396185/article/details/78147612
- zzuli 1023
java 读入单个字符 import java.util.Scanner; public class Main{ public static void main(String args[]){ Sca ...
- 解决navicat连接mysql数据库查询很慢的问题
1.背景: navicat连接数据库进行sql查询,每隔一段时间发现查询会变得很慢 2.原因: Mysql服务器端会定时清理长时间不活跃空闲的数据库连接,进行优化 3.解决方案: Navicat -右 ...
- JUC包常用类原理
放眼望去,java.util.concurrent包下类大致包括:atomic 原子类.锁.并发集合.线程池.工具类.我们挑重要的了解一下. Atomic 原子类 Java针对并发编程已经有了各种锁, ...
- Tmux | 常用操作存档
(因为自己实在是太好忘了,所以在博客存档方便查找) 参考资料:Tmux 使用教程 | 阮一峰的网络日志 tmux new -s <session-name> <Ctrl+B D> ...
- mysql 复制表结构创建表及复制表结构与数据创建表
本文为博主原创,未经允许不得转载: 在开发过程或项目维护发布过程中,经常需要复制建表及复制表数据建表等,整理了以下四种常用的 mysql 命令. 1. create like 复制表结构(包含索引, ...
- 8. exporter
一.已经实现的收集器 1.1 可收集的内存指标 1.2 可收集的jetty指标 二.自定义收集 2.1 summer 2.2 histogram 三.架构设计 exporter作为Prometheus ...
- HanLP — 感知机(Perceptron)
感知机(Perceptron)是一个二类分类的线性分类模型,属于监督式学习算法.最终目的: 将不同的样本分本 感知机饮食了多个权重参数,输入的特征向量先是和对应的权重相乘,再加得到的积相加,然后将加权 ...