zoj1383 zoj3418 二进制 基础

时间:2023-03-09 06:18:06
zoj1383 zoj3418 二进制 基础

传送门

题目大意:从末位到首位输出所在位置的值是1的位置。

可以用除----> 
num>>1  或减---->
-(n^(-n))

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,T;
cin>>T;
while(T--)
{
cin>>n;
int t=0,num=0;
while(true){
if(n==0) break;
if(n&1) {
if(t) cout<<" ";
else t++;
cout<<num;
}
num++;
n=n>>1;
}
if(T) cout<<endl;
}
return 0;
}

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,T;
cin>>T;
while(T--)
{
cin>>n;
int t=0;
while(true){
if(n==0) break;
int k=n&(-n);
n-=k;//减去最后一位为1的数值
k=log2(k);//把数值转化为位置
if(t) cout<<" "<<k;
else cout<<k;
t++;
}
if(T) cout<<endl;
}
return 0;
}

                         zoj3418 传送门2号
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int a[110],b[110];
int _find1(int v)
{
int num=0;
while(v){
if(v&1) num++;
v=v>>1;
}
return num;
}
int main()
{
int T,n,m,i,j,temp;
cin>>T;
while(T--){
cin>>n>>m;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=m;i++) cin>>b[i]; for(i=1;i<=m;i++){
int Minnum=100000,Minpos=0;
for(j=1;j<=n;j++){
temp=_find1(b[i]^a[j]);
if(temp==Minnum&&a[j]<Minpos) Minpos=a[j];
if(temp<Minnum){ Minnum=temp;Minpos=a[j];}
}
cout<<Minpos<<endl;
}
}
return 0;
}