这道题用二分答案的思路做即可
#include<iostream>
#include<iomanip>
using namespace std;
double n,l,r,mid;
bool flag;
double q(double a){return a*a*a;}
int main(){
cin>>n;
l=-10000,r=10000;
while(r-l>=1e-7){
mid=(l+r)/2;
if(q(mid)>=n) r=mid;
else l=mid;
}
cout<<fixed<<setprecision(6)<<l;
return 0;
}
你好,离谱
开挂qaq
sqrt () cbrt() 记住了大哥 doge
有说法的
很高兴认识你,刘浩翔
fixed 是什么大佬?
这个是C++中使用浮点数的写法 你可以去百度一下,就清楚了
卡莎!咱不跟010玩了😭😭
一连!
我要易大山啦!易大山!
令人感慨
卡神,狙神进了,皮神进了,你也禁了是吧
我想問爲什麽 l =mid
画个图就理解了
最后答案不应该取r吗
想问一下这个l和r的取值怎么看啊?为什么有时候l和 r取值是0和n-1,有时候是这种题解的情况,是-10000和10000,谢谢!
看题目要求,这里是3次方根 负数也有三次方根
那就是奇数方跟,范围就是-10000到10000,偶数方根就是0和n-1吗?
如果是偶次方根的话 可以用0到n-1的区间求 也可以用1-n到0区间求
好的,谢谢
能帮忙找找错吗求求大佬们了
%%%%%%%%%%%%%%
mid应该取double类型,然后负数情况没有考虑
负数的情况没考虑
你好,为什么 l=-10000,r=10000; r不能等于n?否则算得不准确?
如果n是负数,r就小于n了,10000就不用考虑细节了
为什么最后输出的是l而不是r?
卡在用了float
为啥i=mid而不是=mid+1呢 兄弟们
精度,答案有可能是mid + 0.1
#include[HTML_REMOVED]
using namespace std;
int main()
{
double n=0;
scanf(“%lf”,&n);
double l=-100,r=100;
while((r-l)>1e-8)
{
double mid=(l+r)/2; //这样子就跟二分的模板对应上了,因为这儿是浮点数,所以不能+1,-1了,不然很容易造成误差,要加或减去一个很小的数才行。
if(midmidmid>=n) r=mid;
else l=mid+(1e-8);
}
printf(“%.6f”,l);
return 0;
}
你可以这样子写,double型不能+1,因为加1对于double类型加的太大了,加一个很小的数,就可以跟y总的二分模板对应上。
因为这个是浮点数二分,相当于是连续的,整数二分的话需要+1
为啥这个我将double变成float 就不行了 这个问题出在哪啊 麻烦大佬可以回答一下吗
float一般不用较好,容易出错,具体原因可以问问度娘
好的好的 谢谢大佬
float能够“准确”表示的精度比double 小很多很多
为什么要1e-7
这样的话可以把误差缩小到1e-7,题目要求只输出6位小数
1e-8最保险,多两位
一般保留k位小数,精度下探两位,比如题目中取6位小数,精度写到1e-8比较保险
为什么呢
请问为啥变符号,负数开立方还是负数呀
em......好像确实不用这么麻烦,我修改一下
#include[HTML_REMOVED]
#include[HTML_REMOVED]
#include[HTML_REMOVED]
using namespace std;
int main(){
double n;
cin>>n;
if(n<0) printf(“%lf”,-pow(-n,1.0/3));
else printf(“%lf”,pow(n,1.0/3));
}
为什么循环成立的条件是 r-l >1e7,用 l<r 就会不精确?有大佬解答吗?
总结,没有原理:硬货
https://mp.csdn.net/mp_blog/creation/editor/136073857
看前一头雾水,看后豁然开朗,原来还可以这样!
有人用牛顿迭代法吗
为啥数据类型用float会超时呀
#
大佬这题时间复杂度怎么算呢