$WA 代码$
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double eps = 1e-6;
double n;
#define Eqs(a, b) ((fabs((a) - (b))) < (eps))
#define Less(a, b) (((a) - (b)) < (-eps))
bool check(double x){
return Eqs(x * x * x, n);
}
int main(){
scanf("%lf", &n);
// 二分逼近
double l = 0.00, r = n;
while(Less(l, r)){
double mid = l + (r - l + eps) / 2.00;
if(check(mid)) l = mid; //若 mid 符合,则尝试更大的值;
else r = mid - eps; //否则尝试更小的值。
}
printf("%f", l); // 输出 double 的转换说明符是 %f
return 0;
}
$AC 代码$
#include <cstdio>
#include <cmath>
using namespace std;
const double eps = 1e-8;
double n;
bool check(double x){
return x * x * x < n; // 直接比较而不是判断等于,避免二分搜索中的稳定性问题
}
int main(){
scanf("%lf", &n);
double l, r;
if (n >= 0) {
l = 0; // 如果n是正数,区间从0开始
r = max(1.0, n); // 确保右边界大于等于1和n
} else {
l = min(-1.0, n); // 如果n是负数,左边界为-1或更小
r = 0; // 确保右边界为0
}
while (r - l > eps) {
double mid = (l + r) / 2.00;
if (check(mid)) l = mid; // 若 mid 的立方小于 n,则尝试更大的值
else r = mid; // 否则尝试更小的值
}
printf("%.6f", l); // 使用 %.6f 保持输出格式一致性(其实有没有 .6 都是一样的,加了会运行快几毫秒)
return 0;
}
用 pow 函数逃课
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double n;
scanf("%lf", &n);
double cubeRoot;
if (n < 0) {
// 如果n是负数,先计算其绝对值的三次方根,然后加上负号
cubeRoot = -pow(-n, 1.0/3.0);
} else {
// 如果n是正数或零,直接计算三次方根
cubeRoot = pow(n, 1.0/3.0);
}
printf("%.6f", cubeRoot);
return 0;
}
最 速 逃 课
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n;
scanf("%lf",&n);
printf("%f",cbrt(n));
return 0;
}
注:cbrt()
和 sqrt()
用法完全一样,只是功能不同。