大数乘(正整数)
My solution:
/*2015.10.31*/
#include<stdio.h>
#include<string.h>
int t1[100],t2[100],t3[1000];
char c1[100],c2[100];
int main()
{
int i,j=0,m1,m2,k=0,g;
gets(c1);
gets(c2);
memset(t3,0,sizeof(t3));
m1=strlen(c1);
m2=strlen(c2);
for(i=m1-1;i>=0;i--)
{
t1[j++]=c1[i]-'0';
}
j=0;
for(i=m2-1;i>=0;i--)
{
t2[j++]=c2[i]-'0';
}
for(i=0;i<m1;i++)
{
k=i;/*当t1数组中的第i个元素和t2整个数组相乘时,把求得的结果按位依次存放在以i为下标起点的t3数组中,见下图*/
for(j=0;j<m2;j++)
{
t3[k++]+=t1[i]*t2[j];
}
}
for(i=0;i<k;i++)
{
if(t3[i]>9)
{
g=t3[i]/10;
t3[i]%=10;
if(i==k-1)/*考虑最高位进位,所以数组长度也要增加,可能某个数组元素为3位数,例124,则原则上需连续两次进位*/
{ /*,但实际只需进一次位即12,12加入到新的数组元素中再通过上述循环继续进位就解决了*/
k+=1;
}
t3[i+1]+=g;
}
}
for(i=k-1;i>=0;i--)
printf("%d",t3[i]);
return 0;
}
/* 如: t3[4] t3[5] t3[6]
(上述程序:) 124 56 0
4 12+56=68 0
4 8 6
较复杂方法:4+2*10+1*100 5*10+6 0
4 2+6+5*10 1
4 2+6 1+5
*/
//下标: 6 5 4 3 2 1 0
// t2元素: 2 3 5 4 8 6
//t1元素: 4 3 1 2
//第一次相乘结果: * * * * * *(i=0)
//第二次相乘结果: * * * * * * (i=1)
//第三次。。。。。。 * * * (i=2)
//第四次 .......... * * (i=3)
//把四次结果相加放入t3数组中.........
//再考虑进位。
类似:
243
X 21
__________
243
486
——————
5103