题目大意:从末位到首位输出所在位置的值是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; }