码迷,mamicode.com
首页 > 其他好文 > 详细

hpu 1701 最后一个1 <水题>

时间:2015-08-25 21:51:48      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:

1710: 最后一个1

时间限制: 1 Sec  内存限制: 128 MB
提交: 51  解决: 32
[提交][状态][讨论版]

题目描述

对于一个十进制的数字x,将他转化为2进制,他的2进制将由0和1组成,求里面的最后一个1在第几位

输入

第一行输入T,代表T组数据,

接下来T行,每行输入一个X。

0<T<1e7

0<X<1e9

输出

输入x的2进制中最后一个1在第几位,

不存在输出0

样例输入

3
0
3
8

样例输出

0
2
1

提示

来源

          思路:就是先二进制的总长度,和从右数(从低位开始的第一个1的位置),然后用总长度减去从右数1的位置为这个1左边有多少位数,然后再加1就是从右数最后一个1

 

所在的位置了!

 

代码:

#include <stdio.h>
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		if(n==0)//如果那个数是0的话,它的二进制0,里面没有1,所以输出0! 
		{
			printf("0\n");
			continue;//继续循环! 
		}
		int t;//用来保存总的二进制数的长度! 
		int k=0;//k用来保存从右数的第一个1的位数(同样也是从左数的最后一个1) 
		int flag=0;//flag用来标记是否找到右数第一个1,如果找到就不再更新k的值! 
		if(n%2==0)//因为如果是偶数的话这样算的二进制的位数会比正常的位数多一,所以就从-1开始! 
			t=-1;
		else//奇数从0开始! 
			t=0;
		while(n)
		{
			t++;
			if(n%2==1&&flag==0)//如果找到第一个1,就将他的位数赋值给k,来保存他的从右数的位数! 
			{
				flag=1;//标记一下,以后的1不用更新k的值! 
				k=t;
			}
			n/=2;  
		}
		printf("%d\n",t-k+1);//总长度减去从右数的值加1就是从左数的位数! 
	}
	return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

hpu 1701 最后一个1 <水题>

标签:

原文地址:http://blog.csdn.net/dxx_111/article/details/47981941

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!