这个题的高精度乘法就数据来说算是比较大的有,长度有5000 * 5000 ,我也没有用字符串去做,不知道会不会超时。我用的是一个整数存四位的方法做的,就效率上来讲也是比较低的,但是还是可以AC的。也不知道还有什么效率更高的算法。 // hdu 1402 mnlm 1.0 #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> using namespace std; 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(); } }