昨天做了腾讯的笔试模拟考。其中有一道非负大数的乘法题。
将其转化为两个数组相乘得到另一个数组输出。
关键在于结果的每一位x的数等于两个数组对应位i j(x = i + j)加上其本身进位。所以最好从数组末尾开始相乘。
#define MAXLENGTH 1000
#include
#include
void compute(char * a, char * b,char *c)
{
int i,j,m,n;
long sum,carry;
m = strlen(a)-1;
n = strlen(b)-1;
for(i = m; i >= 0; i--)
a[i] -= '0';
for(i = n; i >= 0;i--)
b[i] -='0';
c[m + n + 2] ='\0';
carry = 0;
for( int i = m + n;i>=0; i--)
{
sum=carry;
if((j = (i-m)) <0)
j = 0;
for( ;j <= i && j <= n;j++)
sum += a[i - j] * b[j];
c[i + 1] = sum %10 + '0';
carry = sum/10;
}
if((c[0] = carry + '0')=='0')
c[0] = '/040';
}
int main()
{
char a[MAXLENGTH],b[MAXLENGTH],c[MAXLENGTH*2];
puts("Input multiplier");
gets(a);
puts("Input multiplier");
gets(b);
compute(a,b,c);
puts("Answer:");
puts(c);
getchar();
}