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

16 篇文章 0 订阅
#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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绝地反击T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值