描述
给出N个范围在[0, 65535]的整数,编程支持以下的操作:
(1)修改操作:C d,所有的数都增加d。如果超过65535,把结果模65536。 0 <= d <= 65535
(2)查询操作:Q i,统计在N个正整数中有多少个整数其对应的二进制形式的第i位二进制位为非0。0 <= i <= 15。并且最低位i为0。
最后,输出所有查询操作的统计值。
输入输入的第一行为两个正整数N,M,其中N为操作的整数的个数,而M为具体有多少个操作。
输入的第二行为N个正整数,为进行操作的N个正整数。
下面有M行,分别表示M个操作。
N<=100000,M<=200000输出输出所有查询操作Q的统计值,每一个查询操作统计结果输出为一行。
样例输入
3 5 1 2 4 Q 1 Q 2 C 1 Q 1 Q 2
样例输出
1 1 2 1
提示只输出查询操作Q的统计值。
# include <iostream> using namespace std; int main() { int n,m;//N为操作的整数的个数,而M为具体有多少个操作。 char op;//操作类型 int num;//操作数 int a[66000];//保存数据 int i,j; int count=0;//计数 int check; //输入 被操作的数据 cin>>n>>m; for(i=0;i<n;i++){ cin>>a[i]; } //处理 for(i=0;i<m;i++){ cin>>op>>num; //C操作 if(op==‘C‘) for(j=0;j<n;j++){ a[j]+=num; a[j]%=65536;//此处不要忘记!! //cout<<a[j]<<" "; } //Q操作 if(op==‘Q‘){ //数据转化为二进制 count=0; for(j=0;j<n;j++){ check=a[j]>>num;//>>(右移)将一个数的各二进制位右移N位, //移到右端的低位被舍弃,对于无符号数,高位补0。 if(check%2==1) count++; } cout<<count<<endl; } } }
复习一下:
1.左移<< 右移>>
运算符 | 含义 | 描述 |
---|---|---|
<< | 左移 | 用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。 |
>> | 右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。 |
1>>1=0 , 2>>1=1 , 3>>1=1
4>>1=2, 4>>2=1
TIPS:操作的数据为二进制
2.十进制数转化为二进制数
#include <iostream> using namespace std; int main(){ int n,i=0,j; int a[100]; cin>>n; while(n){ a[i]=n%2; n/=2; i++; } for(j=i-1;j>=0;j--) cout<<a[j]; }
原文:https://www.cnblogs.com/ANullValue/p/12330935.html