c# - 将偶数相除,直到结果为奇数
问题描述
我试图将一个数字除以 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 输出是......
1298162592589545472 (0x1204000000000000) reduces to 1153(0x481) in 6 calls after (2x) 3 division operations
请注意,代码的成本不仅仅与除法运算和调用有关,这只是为了说明您如何处理此类问题。
推荐阅读
- python - Python - 读取部分 CSV 单元格
- c++ - 如何用行、列和值初始化 cv::Mat 数组?(在 C++ 类中)
- android - 如果按钮尚未显示,有没有办法加载按钮的 onClickListener?
- ruby-on-rails - 如何从另一个类获取关系
- sql - 从更改日志表到给定日期的状态
- python - 如何在 try-except 语句中正确处理 pyodbc 错误
- powershell - 如何将数据集转换为数组
- python-3.x - 我不知道为什么这不像我认为的那样打印
- typescript - 如何将正确的类型设置为定义的对象键之一?
- c# - 尝试从 SharePoint 页面下载文件时出错