大整数乘法(高精度)
2012-12-01 18:53
281 查看
对于超过20位的数的乘法问题,我们无法使用普通的方法!!!即使是longlong也会超出范围的!
像这样的数,我们只能使用高精度的知识利用数组的方法解决问题!
对于高精度乘法的问题,其实思路和高精度加法的思路差不多,都需要使用
字符数组来存放每次算完的结果!
1 2 3
*4 5 6
________________
12 15 18
8 10 12
4 5 6
_____________________
4 13 28 27 18
观察这个程序不难发现大整数乘法的规律!!!每次算完先不要进位,
先把算玩的结果存到一个2维数组里,最后再求他们的和,求完和之后再进位!!!
最后在逆序输出即可!!哈!!废话不多说,看程序!!!
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char num1[105],num2[105];
int Num1[105],Num2[105];
int Sum[105][105],sum[105];
int i,j;
while(gets(num1))//输入第一个乘数
{
memset(Num1,0,sizeof(Num1));
memset(Num2,0,sizeof(Num2));
memset(Sum,0,sizeof(Sum));//将数组初始化!!
gets(num2);//输入第2个程序!!!
int s1=strlen(num1),
s2=strlen(num2);//求出数组的长度!
for(i=0;i<s1;i++)
Num1[s1-1-i]=num1[i]-'0';
for(j=0;j<s2;j++)
Num2[s2-1-j]=num2[j]-'0';//将字符型数组分别存到整型数组里!!
for(i=0;i<s1;i++)
for(j=0;j<s2;j++)
Sum[i][j+i]=Num1[i]*Num2[j];
for(i=0;i<s1;i++)
{
for(j=i;j<i+s2;j++)
cout<<Sum[i][j];
cout<<endl;
}//依次输出每个中间的加数!!!
int c=0;//用于表示进位!!!!
for(j=0;j<s2+s1-1;j++)
{
int s=0;
for(i=0;i<s1;i++)
s+=Sum[i][j];
sum[j]=(s+c)%10;
c=(s+c)/10;
}//处理进位!!!
for(i=s1+s2-2;i>=0;i--)
cout<<sum[i];//逆序输出每个元素!!!求得两个数的积!!!
cout<<endl;
}
return 0;
}
像这样的数,我们只能使用高精度的知识利用数组的方法解决问题!
对于高精度乘法的问题,其实思路和高精度加法的思路差不多,都需要使用
字符数组来存放每次算完的结果!
1 2 3
*4 5 6
________________
12 15 18
8 10 12
4 5 6
_____________________
4 13 28 27 18
观察这个程序不难发现大整数乘法的规律!!!每次算完先不要进位,
先把算玩的结果存到一个2维数组里,最后再求他们的和,求完和之后再进位!!!
最后在逆序输出即可!!哈!!废话不多说,看程序!!!
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char num1[105],num2[105];
int Num1[105],Num2[105];
int Sum[105][105],sum[105];
int i,j;
while(gets(num1))//输入第一个乘数
{
memset(Num1,0,sizeof(Num1));
memset(Num2,0,sizeof(Num2));
memset(Sum,0,sizeof(Sum));//将数组初始化!!
gets(num2);//输入第2个程序!!!
int s1=strlen(num1),
s2=strlen(num2);//求出数组的长度!
for(i=0;i<s1;i++)
Num1[s1-1-i]=num1[i]-'0';
for(j=0;j<s2;j++)
Num2[s2-1-j]=num2[j]-'0';//将字符型数组分别存到整型数组里!!
for(i=0;i<s1;i++)
for(j=0;j<s2;j++)
Sum[i][j+i]=Num1[i]*Num2[j];
for(i=0;i<s1;i++)
{
for(j=i;j<i+s2;j++)
cout<<Sum[i][j];
cout<<endl;
}//依次输出每个中间的加数!!!
int c=0;//用于表示进位!!!!
for(j=0;j<s2+s1-1;j++)
{
int s=0;
for(i=0;i<s1;i++)
s+=Sum[i][j];
sum[j]=(s+c)%10;
c=(s+c)/10;
}//处理进位!!!
for(i=s1+s2-2;i>=0;i--)
cout<<sum[i];//逆序输出每个元素!!!求得两个数的积!!!
cout<<endl;
}
return 0;
}
相关文章推荐
- 【CodeVS 3123】 高精度练习之超大整数乘法
- 3123 高精度练习之超大整数乘法 - Wikioi
- BZOJ 1263 [SCOI2006]整数划分 - 高精度乘法
- 【vijos1033】【数值/数论】【高精度乘法】整数分解(版本2)
- 【快速傅里叶变换】【FFT】【WikiOI】【P3132】【高精度练习之超大整数乘法】
- CODEVS 3123 高精度练习之超大整数乘法
- 任意长度的高精度大整数和浮点数的加法和乘法
- 整数高精度运算的库(加法,减法,乘法,除法,取模)
- 超大整数乘法模板(高精度乘以低精度)
- POJ 1001 解题报告 高精度大整数乘法模版
- 高精度计算-大整数乘法
- POJ 1001 解题报告 高精度大整数乘法模版
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
- codevs 3123 高精度练习之超大整数乘法
- 【高精度计算 02】 大整数乘法
- 高精度(正整数的加、减、乘法)
- cv3123 高精度练习之超大整数乘法(FFT)
- 华为机试:无线OSS-高精度整数加法、矩阵乘法计算量估算
- wikioi3123 高精度练习之超大整数乘法
- Code[VS] 3123 高精度练习之超大整数乘法