1. 程式人生 > >判斷二進位制半整數(二進位制)

判斷二進位制半整數(二進位制)

連結:https://ac.nowcoder.com/acm/contest/326/A
來源:牛客網
 

題目描述

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進位制下1024是"二進位制整數"。一個正整數滿足其值為2的k次方(k為正整數)我們定義其為"二進位制整數"。現在定義另一種數,其可拆分成兩個"二進位制整數"的和,我們稱作"二進位制半整數"。給你一個數,你需要判定其是否為"二進位制半整數"。例如48,雖然不是"二進位制整數",但是可以拆成32+16,滿足"二進位制半整數"。

輸入描述:

第一行輸入一個正整數T(T<=2000),表示T組樣例,每組樣例輸入一行一個非負整數N(N<=4*10^18)。

輸出描述:

對於每個輸入的整數,是"二進位制半整數"輸出YES,否則輸出NO。

注意2不是,wa兩發我日。。。

#include <bits/stdc++.h>
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lbt(x) (x&(-x))
#define INF 0x3f3f3f3f
#define IOS ios::sync_with_stdio(false)
#define ll long long
using namespace std;
ll n;
int main(){IOS;
    int t;
    cin>>t;
    while(t--){
        cin>>n;
        ll a[3],sum=4;
        a[1]=2,a[2]=2;
        for(int i=1;i<=2;i++){
            while(sum+a[i]<=n){
                sum+=a[i];
                a[i]<<=1;
            }
        }
        if(sum!=n)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}