数字比较
链接:https://ac.nowcoder.com/acm/contest/5713/E
来源:牛客网
题目描述
牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。
由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出">",小于则输出"<",等于则输出"="。
输入描述:
两个数字x和y。
满足1 <= x,y <= 109
输出描述:
一个字符,">","<"或者"="。
示例1
输入
2 2
输出
=
示例2
输入
2 4
输出
=
很明显,题目的题意不难理解,但是给的数据太大了,让快速幂直接比较无处可解。
比较大小的话,可以用除法,但还是得算出幂来。
想来想去,比较的问题还可以借用数学中的对数来比较,这可是很有特性的,在数学课上练了不知多少遍,居然没怎么想起来。
先来看一下对数ans=logax的特性,当x=1时,ans=0;当a>1,x>1时,ans>0;当a>1,0<x<1时,ans<0.
假设对数以10为底。
lg(x/y)=lgx-lgy;
而lgxa=a*lgx;
所以lgxy=y*lgx ; lgyx=x*lgy ;
如果xy/yx>1的,说明前者大于后者,
如果xy/yx<1的,说明前者小于后者;
如果xy/yx=1,说明两者相等。
而lg(xy/yx)=y*lgx-x*lgy;
比较两者只需要看差是否小于0(前小于后),大于0,等于0即可。
注意开double
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 int x,y; 8 cin>>x>>y; 9 double c1=(double)y*log(x); 10 double c2=(double)x*log(y); 11 double res=c1-c2; 12 if(res>0) 13 printf(">"); 14 else if(res<0) 15 printf("<"); 16 else 17 printf("="); 18 return 0; 19 }