判断二进制半整数
鏈接:https://ac.nowcoder.com/acm/contest/326/A
來源:牛客網
?
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
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。示例1
輸入
3 48 49 50輸出
YES NO NO判斷一個數二進制表示是否只有兩個1.
直接判斷n-lowbit(n)是否為2的冪次
fun判斷是否為2的冪次
lowbit取出最低位1的值
要注意long long
ac:
#include<bits/stdc++.h> #define ll long long using namespace std;bool fun(ll n){return (!(n & (n-1))) && n; }ll lowbit(ll x){return x&(-x); }int main() {int t,a;ll n,c;cin>>t;while(t--){cin>>n;if(n%2==1){printf("NO\n");continue;}if(fun(n)==1){if(n!=2)printf("YES\n");else printf("NO\n");continue;}if(fun(n-lowbit(n))==1)printf("YES\n");else printf("NO\n");}return 0; }我剛開始用pow寫,怎么都過不了,后來發現pow前面要加long long,慘
#include<bits/stdc++.h> #define ll long long using namespace std;bool fun(ll n){return (!(n & (n-1))) && n; }int main() {int t,a;ll n,c;cin>>t;while(t--){cin>>n;if(n%2==1||n==0){printf("NO\n");continue;}if(fun(n)==1){if(n!=2)printf("YES\n");else printf("NO\n");continue;}ll m=n;a=0;while(m>1){m=m>>1;a++;}if(fun(n-(ll)pow(2,a))==1)printf("YES\n");else printf("NO\n");}return 0; }?
轉載于:https://www.cnblogs.com/wangtao971115/p/10358224.html
總結
- 上一篇: idea设置JVM运行参数
- 下一篇: python+pywinauto之PC端