繁体   English   中英

除以偶数,直到结果为奇数

[英]Divide even number until the result is an odd number

我试图将一个数字除以 2,如果它是偶数,直到每个操作返回一个奇数,例如,将 16 除以 2 返回 8,除以 2 返回 4 直到它达到 2。

我试过使用递归,但它的表现非常糟糕,所以我改写了下面的代码……问题是它只除一次:

public int InchFraction(int value)
{
    for (int i = 0; i < value; i++)
    {
        if (value % 2 == 0)
        {
            value = value / 2;
            return value;
        }
    }
    return value;
}

InchFraction(16) //它返回 8

public int InchFraction(int value)
{
    while (value % 2 == 0) 
        value /= 2;
    return value;
}

或者因为你正在尝试优化,试试这个

private static int countDivOps = 0;
private static int countCalls = 0;
static ulong M2(ulong v, int p = 32)
{
  var d = 1UL << p;
  countCalls++;
  while (v % d == 0) 
  {
    v /= d;
    countDivOps++;
  }
  return d == 2 ? v : M2(v, p / 2);
}
static void Main(string[] args)
{
  var v = 0x1204000000000000ul;
  var rv = M2(v);
  Console.WriteLine($"{v} reduces to {rv}(0x{rv:X}) in {countCalls} calls after (2x) {countDivOps} division operations");

它不是很漂亮,我让你玩你的调试器,看看它在做什么,但 FWIW output 是......

1298162592589545472 (0x1204000000000000) reduces to 1153(0x481) in 6 calls after (2x) 3 division operations

请注意,代码的成本不仅仅与除法运算和调用有关,这只是为了说明您可能如何处理此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM