題目:為第n個格雷碼對應的數字。
分析:數學,遞歸。利用格雷碼的對稱性求解。
設f(n)為n的解,每次找到不小於n的2^k,然後遞歸計算2^(k+1)-n-1即可;
得到遞歸公式:f(n)= f(2^(k+1)-n-1)+ 2^k。
說明:又是好久没刷题了╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
int value(int n)
{
if (n == 0 || n == 1) {
return n;
}
for (int i = 0; i < 31; ++ i) {
if (n >= (1<<i) && n < (1<<(i+1))) {
return (1<<i) + value((1<<(i+1))-n-1);
}
}
}
int main()
{
int t, n, k;
while (~scanf("%d",&t))
while (t --) {
scanf("%d%d",&n,&k);
printf("%d\n",value(k));
}
return 0;
}