高精度乘法

高精度乘法

作用 模拟乘法的过程
中文名称 高精度乘法
目录导航

问题的提出

由于计算机的 存储 字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为 高精度算法。这里,主要说下高精度乘法。高精度乘法,实际上,就是模拟乘法的过程。像小学的笔算过程。

例题

输入

输入一个整数n,下面的程序中,n不宜太大了。n<=1000。当然,也可以通过调 MAX来实现更大数的 阶乘。

输出

输出n!的精度数。

代码

C语言

对于要求很高的C语言高精度乘法,相信很多人还没有用到过,应为在常规的应用中一般精度的乘法就可以满足我们的计算要求,今天一起来看看高精度乘法的实现方法吧。

/*
高精度乘法输入:两行,每行表示一个非负整数(不超过10000位)
输出:两数的乘积。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 10001
int bigchenfa(int *sum,int *a,int *b,int la,int lb)
{
int i,j,lsum = 0 ;
memset(sum,0,sizeof(sum));
for(i=1 ; i<= la ; i++) /*用数组模拟运算*/
for(j=1,lsum=i-1; j<= lb ; j++)
sum[++lsum] += b[j] * a[i] ;
for(i=1 ; i<= lsum ; i++)/*进位处理*/
if (sum[i] >= 10)
{
if ( sum[lsum] >= 10)
lsum ++ ;
sum[i+1] += sum[i] / 10 ;
sum[i] %= 10 ;
}
return lsum;
}
int main(void)
{
int a[MAX]={0},b[MAX]={0},sum[MAX*2]={0};
int la=0,lb=0,lsum=0;
int i,j;
char sa[MAX],sb[MAX];
scanf(\"%s %s\",sa,sb);
la = strlen(sa);
lb = strlen(sb);
for(i=1,j=la-1; i<= la ; i++,j--)
a[i] = sa[j] - '0' ;
for(i=1,j=lb-1; i<= lb ; i++,j--)
b[i] = sb[j] - '0' ;
lsum = bigchenfa(sum,a,b,la,lb);
for(i=lsum ; i> 0 ; i--)
printf("%d",sum[i]);
printf("\n");
return 0;
}

另:

#include<stdio.h>
int main() {
char n[255]={},m[255]={};
int n1[255]={},m1[255]={},s[510]={};
int i,j,k=0,t,x=0,dig;
int lenn,lenm;
scanf("%s%s",&n,&m);
lenn=strlen(n);
lenm=strlen(m);
for(i=0;i<lenn;i++)
n1[i]=n[i]-48;
for(j=0;j<lenm;j++)
m1[j]=m[j]-48;
for(j=lenm-1;j>=0;j--)
{
t=k;
for(i=lenn-1;i>=0;i--)
{
s[t]+=n1[i]*m1[j];
t++;
}
++k;
dig=t;
}
for(i=0;i<dig;i++)
while(s[i]>=10)
{
s[i]-=10;
++s[i+1];
}
if(s[dig]!=0)
for(i=dig;i>=0;i--)
printf("%d",s[i]);
else
for(i=dig-1;i>=0;i--)
printf("%d",s[i]);
return 0;
}

Pascal

var
i,j,la,lb,len:integer;
s1,s2:string;
m:longint;
a,b,c:array[1..250] of integer;
begin
readln(s1);
la:=length(s1);
readln(s2);
lb:=length(s2);
for i:=1 to la do
a[i]:=ord(s1[la-i+1])-48;
for i:=1 to lb do
b[i]:=ord(s2[lb-i+1])-48;
for i:=1 to la do
for j:=1 to lb do
c[i+j-1]:=c[i+j-1]+a[i]*b[j];
len:=la+lb;
for i:=1 to len do
begin
c[i+1]:=c[i+1]+c[i] div 10;
c[i]:=c[i] mod 10;
end;
while c[len]=0 do dec(len);
m:=c[len];
while m>0 do
begin
c[len]:=m mod 10;
m:=m div 10;
inc(len);
end;
for i:=len-1 downto 1 do
write(c[i]);
end .

C++

#include <iostream>
using namespace std;
int main() {
int a[100],b[100],c[100],len,la,lb,i,j;
long long n,m;
cin>>n>>m;
la=0;
while(n>0)
{
la++;
a[la]=n%10;
n=n/10;
}
lb=0;
while(m>0)
{
lb++;
b[lb]=m%10;
m=m/10;
}
memset(c,0,sizeof(c));
for(i=1;i<=la;i++)
for(j=1;j<=lb;j++)
c[i+j-1]=c[i+j-1]+a[i]*b[j];
len=la+lb;
for(i=1;i<=len;i++)
{
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
while(c[len]==0){len--;}
m=c[len];
while(m>0)
{
c[len]=m%10;
m=m/10;
len++;
}
for(i=len-1;i>=1;i--) {cout<
cout<<endl;
return 0;
}

vb6.0

(vb也是不容忽视的编程软件,需要自己建立3个text,一个timer,一个command。别告诉我这都不会...支持1000位以下高精度,若需更多,自行修改数组元素个数。)

Dim i, j, L(2), a(1000) As Integer, b(1000) As Integer, c(2000, 2000) As Integer, d(2000, 2000) As Integer, x(10000) As Integer, jieguo As String, y(10000) As Integer

Private Sub Command1_Click()

L(1) = Len(Text2.Text)

L(2) = Len(Text3.Text)

For i = 1 To L(1)

a(i) = Val(Mid(Text2.Text, L(1) - i + 1, 1))

Next i

For i = 1 To L(2)

b(i) = Val(Mid(Text3.Text, L(2) - i + 1, 1))

Next i

For i = 1 To L(2)

For j = 1 To L(1)

c(i, j) = b(i) * a(j) + c(i, j)

d(i, j) = Int(c(i, j) / 10)

If d(i, j) > 0 Then

c(i, j) = c(i, j) - 10 * d(i, j)

c(i, j + 1) = c(i, j + 1) + d(i, j)

End If

d(i, j) = 0

Next j

Next i

For i = 1 To L(2)

b(i) = 0

Next i

For i = 1 To L(1)

a(i) = 0

Next i

For i = 1 To L(2)

For j = 1 To L(1) + 1

x(i + j - 1) = x(i + j - 1) + c(i, j)

c(i, j) = 0

Next j

Next i

For i = 1 To L(1) + L(2) + 1

y(i) = Int(x(i) / 10)

If y(i) > 0 Then

x(i) = x(i) - 10 * y(i)

x(i + 1) = x(i + 1) + y(i)

End If

y(i) = 0

Next i

Text1.Text = ""

If x(L(1) + L(2) + 1) <> 0 Then Text1.Text = Text1.Text & x(L(1) + L(2) + 1)

If x(L(1) + L(2)) <> 0 Then Text1.Text = Text1.Text & x(L(1) + L(2))

For i = L(1) + L(2) - 1 To 1 Step -1

Text1.Text = Text1.Text & x(i)

Next i

For i = 1 To L(1) + L(2) + 1

x(i) = 0

Next i

L(1) = 0

L(2) = 0

jieguo = Text1.Text

End Sub

Private Sub Form_Load()

Text2.Text = "a"

Text3.Text = "b"

Text1.Text = "结果"

Command1.Caption = "计算"

Timer1.Interval = True

jieguo = "结果"

End Sub

Private Sub Timer1_Timer()

Text1.Text = jieguo

End Sub

相关百科
返回顶部
产品求购 求购