Live2d Test Env

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;
} 






   
posted @ 2017-09-27 21:06  nimphy  阅读(189)  评论(0编辑  收藏  举报