题目链接:Little Sub and Pascal's Triangle
这一道题是要求杨辉三角的任意一行有多少个奇数
头痛无解
最后搜了一下,有个类似的解答,然后知道怎么写了,但是具体为什么会这样还是不懂
那道题的解法就是,你要求的第几行,就把对应于那行的序号转化为二进制,然后查那个二进制数有几个1,假设这个数是a,那一行就有2的a次方个1
对以上步骤的实现主要采用移位的操作,对行序号进行与运算,如果各位为奇数,运算结果就是1
求2的次方也是采用移位的操作
一下AC代码:
#include<iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
long long n;
cin>>n;
n--;
long long e=1;
while(n>0){
if(n&1){
e<<=1;
n>>=1;
}else{
n>>=1;
}
}
cout<<e<<endl;
}
return 0;
}
然后我参考的代码是这样的
#include<iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int k=__builtin_popcount(n);//得出二进制n中1的个数
cout<<(1LL<<k)<<endl; //2^k
}
return 0;
}
---------------------
作者:XuKathy
来源:CSDN
原文:https://blog.csdn.net/XuKathy/article/details/52653647
版权声明:本文为博主原创文章,转载请附上博文链接!
没见过__builtin_popcount()这个函数
总结:
这样的题,如果之前没见过就写不出来,自己也推不出这样的结论,不是模拟,不能触及到以前的知识,或者说是自己太菜