【CSP2019-S2 自测】格雷码

题目内容

本题的解题思路为找规律,不同位上的01变化有不同的规律,找出来再依次处理即可;
本题需要用到数据范围为2^64,所以需要用unsigned long long类型
需要注意的是unsigned long long最大也只能存下2^64-1,不考虑的话会在最后一个测试点RE。

#include "bits/stdc++.h"
using namespace std;



int main()
{
    
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    unsigned long long k;
    char ans[70];
    cin>>n>>k;
    for(int i = 0 ; i < n-1 ; i++)  //最后一位特殊,只有半个循环
    {
    
    
        if(i!=62)	//(这里在i=62时,会产生2^64,ull存不了,最后一个点过不了,需要分开讨论)
        {
    
    
            unsigned long long ci=pow(2,i+2);   
            unsigned long long ni=(k)%ci;
            if(ni >= (ci>>2) && ni < (ci>>2)*3) ans[i]='1';
            else ans[i]='0';
        }
        else
        {
    
    
            unsigned long long ci=pow(2,i);
            if(k >= ci && k < ci*3) ans[i]='1';
            else ans[i]='0';
        }
        
    }
    ans[n-1]= k>=(pow(2,n-1)) ? '1' : '0';
    for(int i = n-1 ; i >= 0 ; i--) cout<<ans[i];
    cout<<"\n";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43905212/article/details/103487142