取多补少C语言,leetcode题目: 数字的补数 的C语言解法
题目链接
题目内容
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
给定的整数保证在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语言解法相关推荐
- 【无标题】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, ...
- leetcode 476. 数字的补数(Number Complement)
目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含 ...
- c语言如何输入数字,请问如何在C语言中输入数字获得拼音?
请问如何在C语言中输入数字获得拼音? 答案:1 信息版本:手机版 解决时间 2018-12-10 16:41 已解决 2018-12-10 08:20 请问如何在C语言中输入数字获得拼音? 最佳答案 ...
- Java实现 LeetCode 476 数字的补数
476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...
- leetcode题目: 数字的补数 的C语言解法
题目链接 题目内容 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: ...
- c语言高中题目及答案,高中信息技术 C语言程序设计练习题 选修1
专心 爱心 用心1 C C 语言程序设计语言程序设计 练习题练习题 一 单项一 单项选择题选择题 单项选择题要求从给出的四个备选答案中 选出一个最符合题意的答案 本类习题主要检 查对 C 语言基本概念 ...
- 湖北师范大学c语言考试题目,湖北师范学院2010期末C语言试卷.doc
剑飞出品 必属精品 PAGE PAGE1 / NUMPAGES9 卷号:(A) 绝密(2010年/12月) 阅卷人 湖北师范学院考试试卷(闭卷) 高级语言程序设计 试卷 (全院 2010级 理科) 班 ...
- C语言1094题目,基于visual Studio2013解决C语言竞赛题之1094纵横图
/************************************************************************/ /* 二)程序设计 ⑴奇阶纵横图n=2m+1请见填 ...
- 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 的二进制数 ...
最新文章
- flask_sqlalchemy连接Mysql报TypeError: create_engine() got an unexpected keyword argument 'encoding'解决办法
- noip2010关押罪犯
- 4.Spring Cloud Alibaba教程:Nacos配置管理
- BUUCTF-Reverse:reverse2
- mysql-表完成性约束
- 使用码云中文乱码问题解决
- Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能
- Java植物名录程序_程序员用Java语言编写多线程应用程序,程序员能控制的关键性工作有两个方面:一是编写线程的_________方法;二是建立线程实例。...
- host切换工具、修改HOST不用重启IE
- 又一国产手机宣布“退出群聊” 小米接盘:曾令万千女性着迷!
- 鲸鱼优化算法_鲸鱼优化算法:一种群体智能最优化方法
- 单片机c语言曲普两只蝴蝶,51曲谱网_51单片机简谱编码
- 个人网站可以申请微信授权登录吗
- 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
- iSpiik产品说:谈谈小程序直播-数据背后几个思考
- 安防流媒体无插件直播管理设计
- 如何在win10安装libaio,并且使用CFLAGS和LDFLAGS环境变量指示其位置,并且如何设置DS_BUILD_AIO=0禁用async_io...
- php select下拉框,下拉框处理(select)
- 高中计算机专业教师 教学计划,信息技术教师教学计划
- android 录屏方案 VFR和CFR