显示原始代码
#include <iostream>
#include <cstring>
using namespace std;
long long a = 1, b = 1000000000, mid;
char n[30];
void search();
void solve(long long x, char res[]);
void highmul(int a[], int b[], int c[], int size_a, int size_b);
void output(int a[], char res[]);
int cmp(char a[], char b[]);
int main() {
cin >> n;
search(); return 0;
}
void search() {
long long mid = (a + b) / 2;
while (a < b) {
char res[30] = "\0";
solve(mid, res);
if (cmp(res, n) >= 0) {
b = mid;
} else if (cmp(res, n) < 0) {
a = mid + 1;
}
mid = (a + b) / 2;
}
cout << b << endl;
return;
}
void solve(long long x, char res[]) {
long long a = x, b = x + 8;
int s[30] = { 0 }, s1[30] = { 0 }, s2[30] = { 0 }, s3[30] = { 0 };
int i = 0, j = 0;
while (a != 0) {
s[i++] = a % 10; a = a / 10;
}
while (b != 0) {
s1[j++] = b % 10; b = b / 10;
}
highmul(s, s, s2, i, i); highmul(s2, s1, s3, i + i, j);
output(s3, res); return;
}
void highmul(int a[], int b[], int c[], int size_a, int size_b) {
for (int i = 0; i < size_a; i++) {
for (int j = 0; j < size_b; j++) {
c[i + j] += a[i] * b[j]; c[i + j + 1] += c[i + j] / 10; c[i + j] %= 10; }
}
return;
}
void output(int a[], char res[]) {
int i = 25;
while (i >= 0 && a[i] == 0) { i--;
}
for (int j = 0; j <= i; j++) res[j] = a[i - j] + '0';
res[i + 1] = '\0';
return;
}
int cmp(char a[], char b[]) {
if (strlen(a) > strlen(b)) {
return 1;
} else if (strlen(a) < strlen(b)) {
return -1;
} else {
if (strcmp(a, b) > 0) {
return 1;
} else if (strcmp(a, b) < 0) {
return -1;
} else if (strcmp(a, b) == 0) {
return 0;
}
}
}