/*
Name: 大数乘法
Copyright:
Author: 柒
Date: 28/09/11 22:10
Description:
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char str[])
{
int len = strlen(str);
int len2 = (int)(len/2);
int i = 0;
char tmp = 0;
for( i=0; i<len2; i++)
{
tmp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = tmp;
}
}
bool zerovec(char str[])
{
int i = 0;
int tmp = 0;
int len = strlen(str);
for (i=0; i<len; i++)
tmp = tmp + str[i] - '0';
if (tmp)
return 0;
else
return 1;
}
char * mul(char str1[], char str2[])
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = len1 + len2;
char *res = (char*)malloc(len+1);
int i = 0, j = 0, k = 0;
int tmp = 0;
if(zerovec(str1) || zerovec(str2))
{
res[0] = '0';
res[1] = 0;
return res;
}
reverse(str1);
reverse(str2);
for ( i=0; i<len; i++)
res[i] = '0';
res[i] = 0;
int sum = 0, ext = 0;
for ( i=0; i<len1; i++ )
{
k = 0;
ext = 0;
for ( j=0; j<len2; j++ )
{
sum = res[k+i] - '0' + (str1[i] - '0')*(str2[j] - '0') + ext;
res[k+i] = sum%10 + '0';
ext = sum/10;
k++;
}
do
{
sum = res[k+i] - '0' + ext;
res[k+i] = sum%10 + '0';
ext = sum/10;
k++;
}while(ext != 0);
}
for( i=len-1; i>=0; i-- )
{
if(res[i] != '0')
break;
}
res[i+1] = 0;
reverse(res);
return res;
}
int main()
{
char str1[] = "111123313123";
char str2[] = "123456";
char *res = NULL;
res = mul(str1, str2);
printf(res);
system("pause");
return 0;
}
评论