关于大数乘法的数组类型问题(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: ...
随机推荐
- 5G“乍到”,图扑带你了解室内定位可视化的实现与新突破
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- el-menu菜单过长,显示不全问题
- 存储密码-ssh添加秘钥
- 实现不限层级的Element的NavMenu
做管理后台开发的时候,需要用到Element的NavMenu组件,于是乎,翻开文档,大致是这样实现的. <el-menu> <el-menu-item index="1&q ...
- 银行个人住房贷款LPR办理流程-建行app
8月底之前即将需完成银行的个人住房贷款定价基准利率的转换.选择"LPR+浮动利率"或者"固定利率". 以下举例建行app上办理方法给大家参考下. 办理方案: 一 ...
- Vue第四篇 Vue路由系统
01-路由注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Jackson 使用 @JsonFormat 注解进行时间格式化
本文为博主原创,未经允许不得转载: 最近帮同事定位了一个现网问题,记录一下: 项目中对所有请求的参数都进行了 Jackson 序列化,在接收请求的实体类字段上使用 @JsonFormat 注解,该注解 ...
- java - 递归排序 - 求数组最小值
// 递归求数组最小值 public class Bubble { // 定义存储最小值的变量 static int min; public static void main(String[] arg ...
- [转帖]Grafana连接oracle数据库插件
Granfana作为前端监控显示程序提供了迅速图形化查看数据库数据的方式.虽然官网提供了部分免费数据库插件,但毕竟太少,最近需要在Oracle数据库上做项目,发现官方的oracle插件是收费的,几经周 ...
- [转帖]龙叔学ES:Elasticsearch XPACK安全认证
https://juejin.cn/post/7081994919237287950 本文已参与「新人创作礼」活动,一起开启掘金创作之路. Elasticsearch往往存有公司大量的数据,如果安全不 ...