题目详情:
求解 A^B = B^A, (A!=B) ^表示乘方
输入格式
多组数据,每组数据一行,有一个不小于1.1的浮点数,表示A和B中比较小的,求另外一个数。
输出格式
每组数据一行,如果有解输出解,保留5位小数,否则输出-1。
答题说明:
输入样例
2
10
输出样例
4.00000
-1
这个题用二分法可以求解,我当初做的时候不知道那根筋不对,写了一个很奇特的if语句导致错误,还一直没找出来。昨天学了二分思想,发现是自己经常碰到,在心里也有一点总结的方法,在此记下。
using System;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
const double mis = 0.000001;
string str = null;
while ((str = Console.ReadLine()) != null)
{
double a = double.Parse(str);
double buttom = a;
double top = 10000.0;
while (top > buttom + mis)
{
double mid = (top + buttom) / 2;
double y = Math.Pow(a, mid) - Math.Pow(mid, a);
if (y > 0)
{
top = mid;
}
else
{
buttom = mid;
}
}
if (buttom > a)
{
Console.WriteLine("{0:F5}", buttom);
}
else
{
Console.WriteLine(-1);
}
}
}
}
}
#include<stdio.h>
#include<math.h>
const double mis = 0.000001;
double a;
int test(double b){
double x = pow(a, b);
double y = pow(b, a);
return y > x;
}
int main(void){
while(scanf("%lf", &a) == 1){
double low = a;
double up = 100.0;
while(low < up - mis){
double mid = (low + up) / 2;
if(test(mid)){
low = mid;
} else {
up = mid;
}
}
if(fabs(a - low) < mis){
printf("-1\n");
} else {
printf("%.5lf\n", low);
}
}
return 0;
}