csps2019格雷码

解决办法——特殊到一般+逆推

列出前三行

 n=1                   0    1

n=2                  00   01    11    10

n=3           001  001  011  010  110  111  101  100

k在前半部分,退到n-1时,k不变

k在后半部分,退到n-1时,先k=k-2^(n-1)——如n=3,k=6,将k变成6-4得k=2

          再逆序,得k=1,怎样得到的,用到数学知识的对称

提醒一点,2^64超出long long范围了

附上代码:

//csps2019格雷码
//数学,逆推
//long long数据范围,pow,类型转换 
#include
#include
using namespace std;

int n,a[100],cns;
long long k;

int main(){
	cin>>n>>k;
	while(n){
		if(k<(long long)pow(2,n-1))a[++cns]=0;
		else {
			k=k-(long long)pow(2,n-1);
			k=(long long)pow(2,n-1)-1-k;  //这两行等价于k=(long long)pow(2,n)-1-k,但是n=64的时候溢出 
			a[++cns]=1;
		}
		n--;
	}
	for(int i=1;i<=cns;i++)cout<

你可能感兴趣的:(c++)