题目链接

题目内容

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

给定的整数保证在32位带符号整数的范围内。

你可以假定二进制数不包含前导零位。

示例 1:

输入: 5

输出: 2

解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

示例 2:

输入: 1

输出: 0

解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

这里先说一下我原先失败的思路:输入测试数据后,将其从十进制转换为二进制,再进入循环判断把各位数的0 1进行置换,求出其补数之后再进行进制转换变成十进制。

最后测试不同的原因也很简单——数值溢出。测试数据稍大一些,转换为二进制占用的空间就越大,这时即使用long int也无法保证存放。最好的方法是设置成字符数组来存放转换过后的二进制数。

通过代码:

int findComplement(int num) {

int comple = 0, i, j = 0, temp;

char result[32] = {0}; // int -- 4 Byte, 4 * 8 = 32 bits

temp = num;

if (num == 1)

return 0;

else {

while (temp) {

i = temp % 2;

result[j++] = i;

temp = temp / 2;

}

while (j > 0) {

i = result[--j];

if (i == 0)

i = 1;

else

i = 0;

comple = i * pow(2, j) + comple;

}

return comple;

}

}

其实这个程序最后的修改部分很考验一个人的基础,倘若能熟练使用数组,也便不会出现直接定义整型数字导致溢出的现象,而且使用字符数组也少了很多不必要的判定条件。

当然这道题的出题目的并不是考这个,它的目的应该是考验对移位,异或的熟练程度。

int findComplement(int num) {

int re = 0, i = 0;

while (num) {

re += ((num % 2) ^ 1) << i++; //所有位数左移

num >>= 1; //num的所有位数向右移一位

}

return re;

}

位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

左移: 数值溢出的话丢弃掉最高位,0补最低位

右移:最低位正数补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变。

移位其实可以专门写一篇博客了,但我了解和应用并不多,只是参考这别人的介绍大致写了一下规则。以后再碰到类型题可以整理一下。

参考文章:C语言的移位操作符

取多补少C语言,leetcode题目: 数字的补数 的C语言解法相关推荐

  1. 【无标题】7-11 sdut-C语言实验- 数列有序! 7-12 sdut-C语言实验- 中位数 7-13 sdut-C语言实验-各位数字之和排序 7-14 sdut-C语言实验- 冒泡排序中数据交换

    7-11 sdut-C语言实验- 数列有序! 分数 14 全屏浏览题目 切换布局 作者 马新娟 单位 山东理工大学 有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m, ...

  2. leetcode 476. 数字的补数(Number Complement)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含 ...

  3. c语言如何输入数字,请问如何在C语言中输入数字获得拼音?

    请问如何在C语言中输入数字获得拼音? 答案:1  信息版本:手机版 解决时间 2018-12-10 16:41 已解决 2018-12-10 08:20 请问如何在C语言中输入数字获得拼音? 最佳答案 ...

  4. Java实现 LeetCode 476 数字的补数

    476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...

  5. leetcode题目: 数字的补数 的C语言解法

    题目链接 题目内容 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: ...

  6. c语言高中题目及答案,高中信息技术 C语言程序设计练习题 选修1

    专心 爱心 用心1 C C 语言程序设计语言程序设计 练习题练习题 一 单项一 单项选择题选择题 单项选择题要求从给出的四个备选答案中 选出一个最符合题意的答案 本类习题主要检 查对 C 语言基本概念 ...

  7. 湖北师范大学c语言考试题目,湖北师范学院2010期末C语言试卷.doc

    剑飞出品 必属精品 PAGE PAGE1 / NUMPAGES9 卷号:(A) 绝密(2010年/12月) 阅卷人 湖北师范学院考试试卷(闭卷) 高级语言程序设计 试卷 (全院 2010级 理科) 班 ...

  8. C语言1094题目,基于visual Studio2013解决C语言竞赛题之1094纵横图

    /************************************************************************/ /* 二)程序设计 ⑴奇阶纵横图n=2m+1请见填 ...

  9. leetcode 476. 数字的补数(Java版)| How to extract ‘k’ bits from a given position in a number

    题目 https://leetcode-cn.com/problems/number-complement/ 思路 我们想要返回已知数字的补数(num>=1). 思路: 获取 num 的二进制数 ...

最新文章

  1. flask_sqlalchemy连接Mysql报TypeError: create_engine() got an unexpected keyword argument 'encoding'解决办法
  2. noip2010关押罪犯
  3. 4.Spring Cloud Alibaba教程:Nacos配置管理
  4. BUUCTF-Reverse:reverse2
  5. mysql-表完成性约束
  6. 使用码云中文乱码问题解决
  7. Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能
  8. Java植物名录程序_程序员用Java语言编写多线程应用程序,程序员能控制的关键性工作有两个方面:一是编写线程的_________方法;二是建立线程实例。...
  9. host切换工具、修改HOST不用重启IE
  10. 又一国产手机宣布“退出群聊” 小米接盘:曾令万千女性着迷!
  11. 鲸鱼优化算法_鲸鱼优化算法:一种群体智能最优化方法
  12. 单片机c语言曲普两只蝴蝶,51曲谱网_51单片机简谱编码
  13. 个人网站可以申请微信授权登录吗
  14. 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
  15. iSpiik产品说:谈谈小程序直播-数据背后几个思考
  16. 安防流媒体无插件直播管理设计
  17. 如何在win10安装libaio,并且使用CFLAGS和LDFLAGS环境变量指示其位置,并且如何设置DS_BUILD_AIO=0禁用async_io...
  18. php select下拉框,下拉框处理(select)
  19. 高中计算机专业教师 教学计划,信息技术教师教学计划
  20. android 录屏方案 VFR和CFR

热门文章

  1. spring boot+mybatis+generator生成domain大小写问题
  2. [SCOI2009]最长距离
  3. scp和sftp常用操作
  4. Apache 配置:是否显示文件列表
  5. Python编程之数据结构与算法练习_004
  6. centos清除dns cache.
  7. Centos Cacti 0.8.8g
  8. ConvertFrom-String 命令研究
  9. PHP操作excel类 PHPExcel
  10. httpClient学习笔记1