二进制数据处理 福州大学 2013 级计算机类一班 031302126 杨锦洲 2014.09.08 问题描述 ? 给定一个正整数 N ,找出另一个正整数 M ,使得 N 和 M 转化为二进制时,它们所出现的“ 1 ”的个数一致, 且 M 必须比 N 大。输出一个满足条件的最小的 M 。 ? 例如 78 ,转换成二进制为 1001110 ,这个二进制数中 有 4 个“ 1 ”。而 83 ( 1010011 )和 86 ( 1010110 )都 满足二进制中“ 1 ”的个数与 78 一样,且值都比 78 大。但显然 83 是最小的那个,输出它。 问题分析 N :给定的正整数; M 要找到的数。 对 M 的要求: 一、“ 1 ”的个数与 N 相同; 二、大于 N ; 三、所有符合条件的数中的最小值。 问题解决 针对问题一:将 N 转换为二进制存储在数组中 考虑到问题二和三,这里采用逆序存储(低 位在前,高位在后)。 针对问题二、三:将“ 1 ”往高位移位。 例如: N:100101 (正常二进制数)→ 101001 (数组中) 将数组中第一个“ 1 ”向后移一位就可以得到 M 的逆序二进制数。 核心代码 (数组所有元素皆已初始化为 0 ) for(i=0;n!=0;i++) { t[i]=n%2; n=n/2; } 用数组 t[17] 存储 N 的逆序二进制数。 ( N=1000002^17=131072 ) 0 1 1 1 0 0 1 78 ( 1001110 )→ (t[17] 数组中 ) 标号 t 0 1 2 3 4 5 6 for(j=0;ji;j++)if(t[j]==1) { 找到最低位的 1 以及与其最 for(k=j+1;;k++)if(t[k]==0)break; 近但比它高位的 0 break; t[1] 、 t[4] ( j=1,k=4 ) } 核心代码 m=t[k-1]; t[k-1]=t[k]; t[k]=m; 0 1 1 1 0 0 1 高位的 0 降位 ↓ 0 1 1 0 1 0 1 if(k-j1) for(ints=0;s(k+1)/2;s++,j++) {m=t[s];t[s]=t[j];t[j]=m;} 判断 0 降位之后比 0 低位的 1 是否需要降位 通过数组元素的交换完成 降位 二进制转十进制 for(k=i;k=0;k--)sum+=t[k]*pow(2,k); 算法的优缺点分析和改进 算法优缺点分析: 优点:只需要通过简单的移位;思路简明清 晰; 缺点:需要多考虑细节;程序实现上稍微复 杂 总结 整个算法的时间主要花费在几个循环结构上,特别 是当数值较大的时候。因为时间复杂度较难计算, 便没有进行统计。 这里有个细节:当遇到低位全为 0 高位全为 1 的情况 如: 11111100000 ( 11 位)时由于数组 t[17] 所有元 素初始值为 0 ,此时 j=5 、 k=11, 只要将 t[10] 与 t[11] 交换,并将低位的 0 ( t[0]~[t4]) 与高位的 1 ( t[5] ~t[9]) 交换就得到 10000011111 。
您可能关注的文档
最近下载
- 2023承压设备用钢板和钢带 第7部分:不锈钢和耐热钢.docx VIP
- 新媒体文案写作:爆款标题—吸睛有道PPT教学课件.pptx
- 英展 XK3150W-GTW防水计重电子台秤使用说明书.pdf VIP
- 2025年医疗AI应用:诊断辅助与效率提升报告.docx VIP
- 酒店安全风险分级管控和隐患排查治理双重预防机制建设指导书.pdf VIP
- DB34T 5428-2026电动汽车充电设施消防安全管理规范.pdf VIP
- 门店药品法律法规试卷题(食品安全法律法规考试试题及答案).docx VIP
- ASME B18.2.1-2012美标螺栓规范.pdf VIP
- 在线网课学习课堂《研究生生涯发展与规划(山大 )》单元测试考核答案.pdf VIP
- 《如何描述问题》课件.ppt VIP
原创力文档

文档评论(0)