很容易发现这样的规律:
1、计算结果的最后一位的下标最大,其下标之和为6;倒数第二位的下标之和为5,以此类推,第一位的下标之和是0。因此,下标之和的顺序刚好是结果位的位序,我们可以据此求出结果的各个位。
2、最大的下标之和刚好是乘数位数和被乘数位数之和减一,结果位数是乘数位数和被乘数位数之和。据此,我们可以定义结果数组和一维数组,大小是乘数和被乘数位数之和的一维数组来存放结果。
#include<stdio.h>
#include<string.h>
#define MAX_DIGITS 100
void mulBigInteger(char*mulor,char*mulant,char*result);
int main(){
char mulor[MAX_DIGITS+1];
char mulant[MAX_DIGITS+1];
char result[2*MAX_DIGITS+1];
printf("%s/n","input one number");
scanf("%s",mulor);
printf("%s/n","input another number");
scanf("%s",mulant);
char *ptor = mulor;
char *ptant = mulant;
printf("mulor = %s,", mulor);
printf("mulant = %s/n" ,mulant);
mulBigInteger(mulor,mulant,result);
printf("%s * %s = %s",mulor,mulant,result);
return 0;
}
void mulBigInteger(char*mulor,char*mulant,char*result){
char one[MAX_DIGITS];
char two[MAX_DIGITS];
char rel[2*MAX_DIGITS];
int pro[2*MAX_DIGITS];
int row = strlen(mulant);//乘数
int col = strlen(mulor);//被乘数
int i,j;
strcpy(one,mulor);
strcpy(two,mulant);
for (i=0;i<2*MAX_DIGITS;i++)
pro[i]=0;
for(i = row-1; i >=0; i--)
for(j = col-1 ; j >= 0; j--)
{
int product = (one[j]-'0')*(two[i]-'0');
pro[i+j+0] += product/10 ;
pro[i+j+1] += product%10 ;
}
for(i = row+col-1; i>0;i--)
{
if(pro[i]>=10)
{
pro[i-1] +=pro[i]/10;
pro[i] =pro[i]%10;
}
}
int pos =0;
for(i = 0;i<row +col;i++)
if (pro[i]!= 0)
{
pos = i;
break;
}
printf("/n pos =%d/n",pos);
for(i = 0,j = pos;i<row +col;i++,j++)
rel[i] = pro[j]+'0';
rel[row+col]='/0';
strcpy(result,rel);
}