这是一个采访问题:"给定2个整数x和y,检查x是否是y的整数幂"(例如,对于x = 8和y = 2,答案是"真",对于x = 10和y = 2 "假").
明显的解决方案是:
int n = y; while(n < x) n *= y; return n == xRun Code Online (Sandbox Code Playgroud)
现在我在考虑如何改进它.
当然,我可以检查一些特殊情况:比如他们x和y应该是奇数或偶数,也就是说,我们可以检查的至少显著位x和y.但是我想知道我是否可以改进核心算法本身.
是否有一种更有效的方法来做到这一点,有些事情只是感觉不对劲?我正在寻找以对数方式记录最有效的方法.
public bool Read()
{
long count = Interlocked.Increment(ref _count);
switch (count)
{
case 1L:
case 10L:
case 100L:
case 1000L:
case 10000L:
case 100000L:
case 1000000L:
case 10000000L:
case 100000000L:
case 1000000000L:
case 10000000000L:
case 100000000000L:
case 1000000000000L:
case 10000000000000L:
case 100000000000000L:
case 10000000000000000L:
case 100000000000000000L:
case 1000000000000000000L:
_logger.LogFormattable(LogLevel.Debug, $"{count} Rows Read");
break;
}
return _reader.Read();
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是我的微基准测试.
因为对我而言,没有记录就读取了100,000,000条记录需要大约20分钟,那么额外的4秒就没有了.我将采用美丽的数学方式做事.Mathod3在我的场景中胜出.
Run time for 100,000,000 iterations averaged over 100 attempts
Method1 Max: 00:00:00.3253789
Method1 Min: …Run Code Online (Sandbox Code Playgroud)