题解 | #求解立方根#
求解立方根
https://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca
#include <iostream> #include <math.h> using namespace std; float CubeRoot(string n) { uint64_t N = uint64_t(fabs(stof(n) * 1000000)); string sn = to_string(N); auto len = sn.length(); int sign = (stof(n) >= 0) ? 1 : -1; //小于0.05的立方根,四舍五入保留一位小数后,等于0. if (N < 125) { return 0.0; } int count = 0; uint64_t d; //if (len > 4) auto offset = (len - 1) / 3; uint64_t h = N / uint64_t(pow(10, 3 * offset)); // h < 1000 for (int i = 1; i < 10; i++) { count++; if (i * i * i > h) { d = i - 1; break; } } uint64_t a = d * uint64_t(pow(10, offset)); uint64_t b = uint64_t(pow(10, offset + 1)); while (1) { count++; auto i = (a + b) / 2; auto cube = i * i * i; if (cube > N) { b = i; } else if (cube < N) { a = i; if (a == (b - 1)) { d = a; break; } } else { d = i; break; } if (a == b) { d = a; break; } } //最后一位四舍五入 uint64_t k = (d + 5) / 10; float x = float(k / 10.0) * sign; //cout << d / 100.0 << endl; cout << x << endl; //cout << count << endl; return x; } int main() { string n; while (cin >> n) { CubeRoot(n); } return 0; } // 64 位输出请用 printf("%lld")