大位乘法如何快速計算?
請設計一個有效的算法,可以進行兩個n位大整數的乘法運算。
#include
#include
#include
#define N 20000//最大位數。。
void MUL (char *ch1 , char *ch2 , char *ch3)
{// ch3 = ch1*ch2;
int i , j , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , tmp , num1[N] , num2[N] , num3[N];
memset (num1 , 0 , sizeof(num1));
memset (num2 , 0 , sizeof(num2));
memset (num3 , 0 , sizeof(num3));
for (i=len1-1;i>=0;i--) num1[len1-1-i] = ch1[i] - 48; for (i=len2-1;i>=0;i--) num2[len2-1-i] = ch2[i] - 48;
for (i=0;i
{
tmp = 0;
for (j=0;j
{
num3[i+j] += num1[i]*num2[j] + tmp;
tmp = 0;
if (num3[i+j] >= 10) { tmp = num3[i+j]/10; num3[i+j] %= 10; }
}
while (tmp != 0) { num3[i+j] += tmp; tmp = num3[i+j]/10; j ++; }
}
len3 = len1+len2;
while (len3 > 1 && num3[len3-1] == 0) len3 --;
for (i=0;i
ch3[len3] = '\0';
return ;
}
int main()
{
char p[N], q[N];
char n[N] = "";
printf("計算p與q的乘積:\n");
printf("p = ");
gets(p);
printf("q = ");
gets(q);
MUL(p, q, n);
printf("p*q = %s\n", n);
printf("\n");
getch();
return (0);
}
運行結果如下:...
有趣的乘法計算,十位相同,個位相加大於十的怎麼算
2位數嗎,大於10加上去啊
請設計一個有效的算法,可以進行兩個n位大整數的乘法運算。
#include
#include
void a2d(int x[],char a[])
{
int i,j;
for(i=0;i<505;i++)
x[i]=0;
j=strlen(a)-1;
for(i=0;j>=0;j--,i++)
x[i]=a[j]-'0';
}
int my_len(int x[])
{
int i;
for(i=504;i>=0&&x[i]==0;i--);
return i<0?0:i;
}
void multi(int x[],int y[])
{
int sum[505]={0},i,j,k,lx=my_len(x),ly=my_len(y);
for(i=0;i<=lx;i++)
for(j=0;j<=ly;j++)
sum[i+j]+=x[i]*y[j];
for(i=0;i<504;i++)
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
x[i]=sum[i];
}
}
int main()
{
int i,x[505],y[505];
char a[505],b[505];
while(scanf("%s%s",a,b)!=EOF)
{
a2d(x,a);
a2d(y,b);
multi(x,y);
i=my_len(x);
for(;i>=0;i--)
printf("%d",x[i]);
puts("");
}
return 0;
}
小數乘一位小數的乘法算式,怎樣的算式結果最大
小數可以帶有整數部分,
並不僅僅指純小數,
所以小數乘以一位小數,沒有結果最大的數值,要多大有多大,
如:0.12×0.1=0.012,
503.2×0.1=50.32,
988.55×23.7=23428.635,
……
求一個Pascal最大可以計算兩百位乘兩百位的乘法高精度
程序用常數串x、y輸入數據。你可自行調整:{1219326311370217952237463801111263526900 }constx:string='12345678901234567890';y:string='98765432109876543210';vara,b:array[1..200] of shortint;c:array[1..400] of shortint;ia,ib,ic:integer;i,j,k:integer;m,p,q:integer;beginia:=length(x);ib:=length(y);for i:=1 to ia do a[i]:=ord(x[ia+1-i])-ord('0');for i:=1 to ib do b[i]:=ord(y[ib+1-i])-ord('0');for i:=1 to 400 do c[i]:=0;for i:=1 to ia do beginp:=0; {進位}for j:=1 to ib do beginm:=a[i]*b[j]+p+c[i+j-1];q:=m mod 10;c[i+j-1]:=q;p:=m div 10;end;c[i+ib]:=p;end;for i:=400 downto 1 do if c[i]<>0 then begin k:=i; break; end;for i:=k downto 1 do write(c[i]:1);end.