离离原上谱了这。
我尝试用的数学方法,列方程:
ax+b(lgx+1)=c
用 wolframealpha 解:
x=aln10bW(b10c/b−1aln10)
代码:
#include <iostream>
#include <cmath>
using namespace std;
inline double LambertW(double x)
{
if (x < 0)
{
return -1;
}
if (x == 0)
{
return x;
}
double y = x;
x = log(x);
while (1)
{
double z = log(y) + y;
double tmp = z - x;
if (abs(tmp) < 1e-2)
{
break;
}
if (tmp < 0)
{
y *= 1.02;
}
if (tmp > 0)
{
y *= 0.98;
}
}
return y;
}
int main()
{
double a, b, c;
cin >> a >> b >> c;
double x = (b * LambertW((pow(10, c / b - 1) * a * log(10) / b))) / (a * log(10));
cout << x;
}
看上去算法应该挺快的啊,能做到 O(1) 的复杂度。