我试图找到以下等式的立方根(t),约束
F(t)= A(t ^ 3)+ B(t ^ 2)+ C *(t)+ D,F(t)< = 10 ^ 18。
帮助找到使得F(t + 1)> K和F(t)< = K
我尝试了以下方法;
我所做的是遵循二分搜索方法。实际上将t值设为k / 2。如果结果值大于k,我将尝试使用t值k / 4.Else如果结果小于k,我将检查t值k / 4。该程序似乎适用较小的k值,但问题是超过较大k的范围的值。我想我应该拾取一个更好的枢轴值(intiall值)或改变一些方程式
int a,b,c,d;
long long int k,x,y;
long long int i,f,temp1;
int def;
def=0;
cin>>a>>b>>c>>d>>k;
i=1;
f=k;
temp1=(1+k)/2;
while((temp1>=1)&&(temp1<=k))
{
x=a*(temp1+1)*(temp1+1)*(temp1+1)+b*(temp1+1)*(temp1+1)+c*(temp1+1)+d;
y=a*(temp1)*(temp1)*(temp1)+b*temp1*temp1+c*temp1+d;
if((x>k)&&(y<=k))
{
cout<<temp1<<endl;
def=1;
break;
}
else if(x<k)
{
i=temp1;
temp1=(f+temp1)/2;
}
else if(x>k)
{
f=temp1;
temp1=(i+temp1)/2;
}
}
if(def==0)
cout<<def<<endl;
return 0;
}
答案 0 :(得分:0)
总是有可能遇到溢出,因为a, b, c, d
的约束是动态的,即它们取决于用户。
但是,在进行二分查找时,您可以为要搜索的范围选择更好的结束值,但如果a,b,c,d的值很大,则可能还会出现溢出。
你的二进制搜索也太复杂了,我写了一个更简单的二进制搜索解决方案。
注意:如果a,b,c,d的值很大,则会出现溢出,因此您可能想要使用更好的结束范围来搜索t
值,在我的示例中,我已经采取了它为1000000
即k的立方根,因为其他值很小。
c ++中的代码:
#include <iostream>
using namespace std;
long long a, b, c, d, k;
long long F_t(int val){
long long ans = (a*val*val*val) + (b*val*val) + (c*val) + d;
return ans;
}
bool check(int mid){
if(F_t(mid) <= k) return true;
return false;
}
int main() {
cin >> a >> b >> c >> d >> k;
long long st = 1, en = 1000000, ans = 0;
while(st <= en){
long long mid = (st+en)/2LL;
if(check(mid) == true){
ans = max(ans, mid);
st = mid+1;
}else{
en = mid-1;
}
}
cout << ans << endl;
return 0;
}
Ideone上的演示:http://ideone.com/4WlRuc
大整数库可能会有所帮助,因为它可以消除溢出的可能性,并始终使用上述算法提供正确的结果,您可以将范围的端点值设为k
(即en = k
),复杂性为O(log2(k))
。