poj 2453

题目描述                             An Easy Problem

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 7537 Accepted: 4473

Description

As we known, data stored in the computers is in binary form. The problem we discuss now is about the positive integers and its binary form.

Given a positive integer I, you task is to find out an integer J, which is the minimum integer greater than I, and the number of '1's in whose binary form is the same as that in the binary form of I.

For example, if "78" is given, we can write out its binary form, "1001110". This binary form has 4 '1's. The minimum integer, which is greater than "1001110" and also contains 4 '1's, is "1010011", i.e. "83", so you should output "83".

Input

One integer per line, which is I (1 <= I <= 1000000).

A line containing a number "0" terminates input, and this line need not be processed.

Output

One integer per line, which is J.

Sample Input

1
2
3
4
78
0

Sample Output

2
4
5
8
83

大意:就是找比n大的数并且二进制的1数目相同

体会:题不难,打代码15分钟左右吧,1A。虽说是水题但是还算开心。

            菜鸟代码,欢迎斧正

#include<cstdio>
#include<cstdlib>
#include<cstring>
int binary[30];
int find_bit(int n)
{
    int ans,i,node;
    memset(binary,0,sizeof(binary));
    for(i=0;;i++)
    {
        if(n==1)
        {
            binary[i]=1;
            break;
        }
        binary[i]=n%2;
        n/=2;
    }//将n转化为二进制
    node=i;ans=0;
    for(i=0;i<=node;i++)
    {
        ans+=1&binary[i];
    }          //查找n的1数目
    return ans;
}
int main()
{
    int n,bit,i,bit2;
    while(scanf("%d",&n),n)
    {
       bit=find_bit(n);
       while(1)
       {
           n++;
           bit2=find_bit(n);
           if(bit==bit2)
            break;
       }
       printf("%d\n",n);
    }
    return 0;
}

有必要粘上大牛的代码
#include <stdio.h>
int main()
{
    int n,x;
    while(scanf("%d",&n),n)
    {
        x=n&-n;
        printf("%d\n",n+x+(n^n+x)/x/4);
    }
}

/*x呢 是最后一个1出现的
n+x 是从后往前第一个01转化为10
n^n+x/x/4就是把所有后面的1后移了*/


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值