public int CalcBrackets(int teamCount)
{
int positions = 1;
while (positions < teamCount)
positions *= 2;
return positions;
}
我想要得到2的冪的最小數,並且大於或等於teamCount。這真的是最好的方式嗎?它看起來很可怕:(C#數學問題:2的最小冪比X大嗎?
public int CalcBrackets(int teamCount)
{
int positions = 1;
while (positions < teamCount)
positions *= 2;
return positions;
}
我想要得到2的冪的最小數,並且大於或等於teamCount。這真的是最好的方式嗎?它看起來很可怕:(C#數學問題:2的最小冪比X大嗎?
如果你需要計算2(而不是倍數)最小的那麼小於那麼teamCount,那麼這可能是最好的方法。以對數爲代價是一個代價高昂的操作,可能需要更多的時間,然後進行一個簡單的循環。
UPD 下面是一個算法使用按位運算(C++)(http://aggregate.org/MAGIC/,部分下一個最大的2的冪)
unsigned int nlpo2(unsigned int x)
{
x--; // comment out to always take the next biggest power of two, even if x is already a power of two
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
x |= (x >> 16);
return (x+1);
}
首先,它設置的所有相關數字的位數爲1(例如,0x3ff),然後遞增(0x400)以獲得2的冪。
最小多個
return (teamCount % 2 == 0 ? teamCount : teamCount + 1);
最小功率,你可以把日誌。喜歡的東西
2 ** (ceil(log_2(teamCount)))
有關合適的小區和log_2功能。你的技巧儘管如此,
這不是真正的C#代碼。 – 2016-03-09 11:06:58
這種方式很簡單:
if (teamCount % 2 == 0)
return teamCount;
else
return (teamCount + 1);
那while
循環不會超過2的倍數,而是2的冪。
如果妳確實需要多隻加1除以2得到半部分,然後乘以二回:
return ((teamCount+1)/2)*2
所以,如果是即使如此,你獲得背面,同樣nuber,而如果它很奇怪,因爲你加1然後分開,你會得到下一個偶數。
不小得多,如果你的意思是多個2 * 2 * 2 * 2 * log aritm最好的方法是在基數2中使用logaritma函數,並將結果舍入爲低基數。也就是說,如果團隊數等於35 log 2 base 35給你5,xxx將它舍入爲5.
你的代碼返回最小的* power * 2.這就是你想要的,還是你在最小倍數之後? – YXD 2011-04-02 18:53:02
哎呀,意味着最小的力量。 – bevacqua 2011-04-02 18:59:51