#include #include using namespace std; //两个字符串相乘 string strMultiply(string str1, string str2) { string strResult = ""; int len1 = str1.length(); int len2 = str2.length(); int num[500] = {0}; int i = 0, j = 0; for (i = 0; i < len1; i++) { for (j = 0; j < len2; j++) { num[len1 - 1 - i + len2 - 1 - j] += (str1[i] - '0') * (str2[j] - '0'); } } for (i = 0; i < len1 + len2; i++) { num[i + 1] += num[i] / 10; num[i] = num[i] % 10; } for (i = len1 + len2 - 1; i >= 0; i--) { if (0 != num[i]) break; } for (j = i; j >= 0; j--) { strResult += num[j] + '0'; } return strResult; } //str1 * 10^pos后(即在str1后添上pos个0),与str2作比较 int compare(string str1, string str2, int pos) { int len1 = str1.length(); int len2 = str2.length(); if (len2 > len1 + pos) return 0; if (len2 < len1 + pos) return 1; int i = 0; for (i = 0; i < len2; i++) { if (str1[i] - '0' > str2[i] - '0') return 1; if (str1[i] - '0' < str2[i] - '0') return 0; } return 0; } //对大数str开方取整 string sqrtLarge(string str) { int len = str.length(); int i = 0; int j = 0; string strResult = ""; string str1 = ""; if (0 == len % 2) { //为偶数位 for (i = 0; i < len / 2; i++) { for (j = 0; j < 10; j++) { str1 = strResult; str1 += j + '0'; if (1 == compare(strMultiply(str1, str1), str, 2 * (len / 2 - i - 1))) { //由于str1后少了len/2-i-1个0,所以平方以后少了2*(len/2-i-1)个 strResult += j - 1 + '0'; break; } if (9 == j) strResult += '9'; } } } else { //为奇数位 for (i = 0; i < len / 2 + 1; i++) { for (j = 0; j < 10; j++) { str1 = strResult; str1 += j + '0'; if (1 == compare(strMultiply(str1, str1), str, 2 * (len / 2 - i))) { strResult += j - 1 + '0'; break; } if (9 == j) strResult += '9'; } } } return strResult; } int main() { string str1; string str2; string strResult; cin >> str1 >> str2; cout << strMultiply(sqrtLarge(str1), sqrtLarge(str2)) << endl; return 0; }