前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 2453 贪心应用

POJ 2453 贪心应用

作者头像
Michael阿明
发布2021-02-20 10:47:41
2700
发布2021-02-20 10:47:41
举报
文章被收录于专栏:Michael阿明学习之路

1. 题目

1.1 题目链接

http://poj.org/problem?id=2453

1.2 题目大意

一个数x的二进制表示有n个1,求一个有相同个数1的二进制数(比x大,且要最小的)

1.3 解题思路

  • 求出该数的二进制表示
  • 从低位往高位找到第一个为1的位 i ,检查其下一位 i+1
  • i+1 位值为 0,直接交换01,结束查找
  • i+1 位值为1,将 i 位的1不断地与前面的交换,换至最低位
  • 重复以上过程

2. Accepted 代码

代码语言:javascript
复制
/**
 * @description: 贪心应用poj2453
 * @author: michael ming
 * @date: 2019/7/2 20:46
 * @modified by:
 */
#include <cstring>
#include <iostream>
using namespace std;
 int calc(int num, int *binarynum)
{
    int i = 0, j, k, value = 0;
    while(num != 0)
    {
        binarynum[i++] = num % 2;//数组存储的是该数的二进制的反序序列
        num = num/2;
    }
    k = i;//k记录最后一个有效位的下一位
    for(i = 0; i < k; ++i)
    {
        if(binarynum[i] == 0)
            continue;//找到为1的i
        if(binarynum[i+1] == 0)//如果i的下一个为0
        {
            swap(binarynum[i],binarynum[i+1]);//交换完成寻找
            break;
        }
        for(j = i; j >= 1; --j)//否则将i处的1换到最开始
        {
            swap(binarynum[j],binarynum[j-1]);
        }
    }
    for(i = k; i >= 0; --i)//计算对应的10进制数值
        //最后一位k-1可能进位到k,所以i从k开始
        value = value*2 + binarynum[i];
    return value;
}
int main()
{
	int binarynum[30];//数据大小不会超过30位2进制
	int num;
	while(cin >> num && num)
    {
	    memset(binarynum,0,30*sizeof(int));
	    cout << calc(num,binarynum) << endl;
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
    • 1.1 题目链接
      • 1.2 题目大意
        • 1.3 解题思路
        • 2. Accepted 代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档