这个题的高精度乘法就数据来说算是比较大的有,长度有5000 * 5000 ,我也没有用字符串去做,不知道会不会超时。我用的是一个整数存四位的方法做的,就效率上来讲也是比较低的,但是还是可以AC的。也不知道还有什么效率更高的算法。
int a[20000];
int b[20000]; //两个大数用整形存储
int ans[400000000]; //计算结果
char sa[50001];
char sb[50001]; //读入的字符串
int lena;
int lenb; //整形的长度
int l; //结果的长度
void stoint(char *ss, int * t, int &i) //将字符串转换为整形存储
{
int len = strlen(ss);
char s[10] = {0};
for (i = 0; len / 4; len -= 4)
{
strncpy(s, ss + len - 4, 4);
t[i++] = atoi(s);
}
if (len)
{
memset(s, 0, sizeof(s));
strncpy(s, ss, len);
t[i++] = atoi(s);
}
}
void Print()
{
int i;
printf("%d", ans[l - 1]);
for (i = l - 2; i >= 0; i--)
{
printf("%04d", ans[i]);
}
printf("/n");
}
int main()
{
while (scanf("%s%s", sa, sb) != EOF)
{
int i;
int j;
memset(a, 0, sizeof(sa));
memset(b, 0, sizeof(sb));
stoint(sa, a, lena);
stoint(sb, b, lenb);
int jw;
memset(ans, 0, (lena + lenb + 2 )* sizeof(int));
for (i = 0; i < lena; i++)
{
jw = 0;
l = i;
for (j = 0; j < lenb; j++)
{
jw += a[i] * b[j] + ans[l];
ans[l++] = jw % 10000;
jw /= 10000;
}
while (jw)
{
jw += ans[l];
ans[l++] = jw % 10000;
jw /= 10000;
}
}
Print();
}
}