ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.

#include<stdio.h>

//每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多。

/*  样例输入:    样例输出:

            1			2
            2			4
            3			5
            4			8
           78			83
			0
*/
//78的二进制位1001110,有4个1;83比78大且83的二进制位1001011也是4个1.

int main()
{
	int count1,count2;//count1统计原数据对应的二进制中1的个数,count2...
	int a[100];//存输入的数字

	int i=0,len=0;//i是循环变量,len是数字个数

	int n;//n时输入数字的变量

	int A,B;//下面求余、相除、时需要用到的变量
	int temp=0;//判断是0还是1

	while(1)//循环输入多组数据直到输入的是0结束输入
	{
		scanf("%d",&n);
		if(n==0)//输入0时结束输入,放在这里0的值就不会存到数组中了
			break;
		a[i]=n;
		i++;
		len++;
	}
	for(i=0;i<len;i++)//循环比较a数组中的每一个数字
	{
		A=a[i];//把a[i]的值赋给A,下面就用A来运算,a[i]的值就不会变了,以便下面求比它大的数字a[i]++
		count1=0;//关键一步,计算每一个数组a中的数据时,都要把count1初始化为0,切记切记!!!
		while(A)
		{
			temp=A%2;
			A=A/2;
			if(temp==1)//二进制位是1时,计数器加1
			{
				count1++;
			}
		}

		while(a[i]++)//a[i]依次做加1操作直到找出和a[i]对应的二进制数组1的个数相等的最小整数
		{
			B=a[i];
			count2=0;//关键一步,计算每一个a[i]++数据时,都要把count2初始化为0,切记切记!!!
			while(B)//此循环求出二进制中1的个数
			{
				temp=B%2;
				B=B/2;
				if(temp==1)//二进制位是1时,计数器加1
				{
					count2++;
				}
			}
			if(count1==count2)//二进制中1的个数相等就输出a[i]的值并跳出此循环。退到最外层的for循环
			{
				printf("%d\n",a[i]);
				break;
			}
		}

	}
	return 0;
}

时间: 2024-12-10 10:49:26

ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.的相关文章

说一说,求一个正整数的二进制中0的个数

昨天突然看到一个算法题:一个正整数a的二进制中0的个数: 话说这是个老题了,直观的算法就每次右移一位,直到0为止:代码就省略了: 仔细想想有更好的方案么? 就是这个题可以转换成一个正整数~a的二进制中1的个数: 求1的个数这个貌似就很熟悉了吧: int num = 0; b = ~a; while(b){ num++; b = b & (b-1); } 是不是容易了许多呢 另外像java和python这种没有unsigned的语言要自己去转 b = ~a & 0x0ffff

[ACM] POJ 3252 Round Numbers (一个区间内二进制中0的个数大于等于1的个数有多少个,组合)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 假设该整数为i.首先i和1做与运算,判断i的最低位是不是为1.接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1.基于此,我们得到如下代码 int NumberOf1_Solution(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

一个整数对应二进制中1的个数

#include <stdio.h> #include <stdlib.h> /* 4.统计一个整数对应的二进制数的1的个数. 输入一个整数(可正可负), 输出该整数的二进制包含1的个数, “ctl+ z” 结束. */ int main(){ int number; while (scanf("%d", &number) != EOF){ int num[100] = {0}; int length = 0; if (number < 0) nu

统计一个整数二进制中1的个数

输入一个非负整数num,对于每一个i,0<=i<=num,计算i的二进制表示中,有几个'1',例如输入num=5,输出0,1,1,2,1,2. #include <iostream> using namespace std; // 解法1 int countOne(int num) {     int count = 0;     while ( num )     {         // 当最后一位为1时,则加1         if( num & 1 ){      

写一个参数返回二进制中1的个数

#include<stdio.h> int main()  {  int num;  int s=0,yus=0,count=0; printf("请输入一个数字:");  scanf("%d",&num);  for(s=num;s>=1;)  {  yus=s%2;  s=s/2;  if (yus==1)  {  count++;  }  }  printf("%d\n",count);  return 0;  }

用一个函数返回参数二进制中1的个数

//题目:写一个函数返回参数二进制中的1的个数 //      比如:15    0000 1111  4个1 //     程序原型:  int count_one_bit(unsigned int value) //                {  //                        //返回1的个数 //                 }     #include<stdio.h> #include<stdlib.h> int count_one_bit

计算一个整数的二进制中1的个数

问题: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight). For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should