取多补少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语言的移位操作符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf mvvm MenuItem的Command事件

这是一个事件的辅助类&#xff0c;可以通过它实现MenuItem的Command事件 public class MyCommands : Freezable, ICommand, ICommandSource{public MyCommands() {}public static readonly DependencyProperty CommandParameterProperty DependencyProperty.Register("Com…

python写字板_pywinauto简单操作写字板的例子

前段时间写了做web程序界面自动化的简单例子&#xff0c;今天写一下windows gui程序界面自动化测例子吧。def openwordpad():app application.Application()wordpadapp.start(r"C:\Program Files\Windows NT\Accessories\wordpad.exe")wordpad.wordpadclass.RICHEDI…

c语言 spawn函数,我在electron程序中spawn了一个C语言程序作为子进程,我该如何与这个子进程通信?...

C语言的代码为&#xff1a;#include int main(){int i 0;scanf("%d", &i);printf("%d\n", i);scanf("%d", &i);printf("%d\n", i);return 0;}我用sub_process.stdin.write("1\n");后&#xff0c;它不会立即输出&am…

LeetCode MySQL 1667. 修复表中的名字

文章目录1. 题目2. 解题1. 题目 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | -------------------------user_id 是该表的主键。 该表包含用户的 I…

junit跳过datasource_maven – spring集成测试无法加载上下文“另一个资源已存在,名称为dataSource”...

我正在使用spring-boot 1.4.3中引入的测试注释进行集成测试RunWith(SpringRunner.class)SpringBootTestpublic class MyServiceIT { }根据documentation,测试上下文被缓存并重用以加速集成测试.这种行为是我想要的,因为它需要大量的时间来初始化应用程序上下文.我的故障安全插件…

7.Reverse Integer (INT; Overflow)

Reverse digits of an integer. Example1: x 123, return 321Example2: x -123, return -321 思路&#xff1a;要注意溢出。用以下做法&#xff0c;会溢出。 class Solution { public:int reverse(int x) {int ret 0;while(x){ret ret * 10 x%10;x / 10;}return ret;} };…

c语言汇编混合编程写一个乘法,求通过C语言实现矩阵的加、减及乘法。要自己写的,不要复制过来...

满意答案eevfikx22013.11.28采纳率&#xff1a;53% 等级&#xff1a;13已帮助&#xff1a;8891人#include using namespace std;int main(){int am3,bm3,an3,bn3;int a[am][an];int b[bm][bn];for(int i0;i{for(int j0;j{a[i][j]i*amj;}}for(int i0;i{for(int j0;j{b[i][j]i…

LeetCode MySQL 1821. 寻找今年具有正收入的客户

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Customers -------------------- | Column Name | Type | -------------------- | customer_id | int | | year | int | | revenue | int | --------------------(customer_id, year) 是这个表的主键。 这个表…

【Head First Java 读书笔记】(一)基本概念

Java的工作方式 你要做的事情就是会编写源代码 Java的程序结构 类存于源文件里面 方法存在类中 语句存于方法中 剖析类 当Java虚拟机启动执行时&#xff0c;它会寻找你在命令列中所指定的类&#xff0c;然后它会锁定像下面这样一个特定的方法: public static void main(String[…

oid 值 内存使用_[技术干货] zabbix监控项原型组合键值

自动发现中监控项原型使用多个值组合成一个新的键值。这里我们以华为RH5885V3的内存为例&#xff1a;我们先walk出要用来作为组合键值的值&#xff0c;我们称之为VALUE。而OID节点后面延伸出来的数值&#xff0c;例如.1、.2、.3这种&#xff0c;我们称之为INDEX。组合键值的关键…

c语言从键盘输入asdfg输出asdfg,C语言复习题参考答案.doc

第1题功能&#xff1a;将十进制数转换成十六进制数。第2题功能&#xff1a;删除字符串中的指定字符&#xff0c;字符串和要删除的字符均由键盘输入。第3题功能&#xff1a;以下程序是用选择法对10个整数按升序排序。第4题功能&#xff1a;以下程序的功能如(图1)。第5题功能&…

LeetCode MySQL 1853. 转换日期格式(日期格式化)

文章目录1. 题目2. 解题1. 题目 表: Days ------------------- | Column Name | Type | ------------------- | day | date | -------------------day 是这个表的主键。 给定一个Days表&#xff0c;请你编写SQL查询语句&#xff0c;将Days表中的每一个日期转化为&qu…

自定义计算器 android,自定义公式计算app下载

自定义公式计算器是非常强大的一款计算器软件&#xff0c;可以帮助大家计算各种函数&#xff0c;还能够自定义公式进行保存&#xff0c;便于以后的计算&#xff1b;软件包含了科学计算器的所有功能&#xff0c;而且没有广告&#xff0c;非常的方便和强大&#xff0c;喜欢的朋友…

进度条上的小圆点怎么做_傲视网:【AE教程】如何制作环形进度条(第一讲)...

原标题&#xff1a;傲视网&#xff1a;【AE教程】如何制作环形进度条(第一讲)大家好&#xff0c;福利来啦&#xff01;这里将分享如何制作环形进度条&#xff0c;教你如何从入门到精通学AE。环形进度条是个特殊的动画&#xff0c;在旋转的基础上还要选择性地显示部分区域。制作…

android 行布局选择器,『自定义View实战』—— 银行种类选择器

在工作中难免遇到自定义 View 的相关需求&#xff0c;本身这方面比较薄弱&#xff0c;因此做个记录&#xff0c;也是自己学习和成长的积累。自定义View实战前言年前的最后一个开发需求&#xff0c;将之前H5开卡界面转变成native。意思就是开卡这个需求做成Android原生的界面&am…

LeetCode 1971. Find if Path Exists in Graph(图的遍历)

文章目录1. 题目2. 解题1. 题目 There is a bi-directional graph with n vertices, where each vertex is labeled from 0 to n - 1 (inclusive). The edges in the graph are represented as a 2D integer array edges, where each edges[i] [ui, vi] denotes a bi-directi…

月之数

月之数 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 65 Accepted Submission(s) : 35 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 当寒月还在读大一的时候&#xff0…

更新wpscan_wpscan扫描工具

简介WPScan是一个扫描WordPress漏洞的黑盒子扫描器&#xff0c;可以扫描出wordpress的版本&#xff0c;主题&#xff0c;插件&#xff0c;后台用户以及爆破后台用户密码等&#xff0c;Kali Linux默认自带了WPScan&#xff0c;也可以到Github项目仓库[1]中下载安装&#xff0c;其…

android monkey压力测试,Android-Monkey 压力测试

1.Monkey 介绍Monkey是Android中一个对App进行压力测试的命令行工具&#xff0c;可以向系统发送伪随机的用户事件流对正在开发的App进行压力测试(模拟用户操作App)。压力测试主要是为了提高App的稳定性、和用户留存率。Monkey功能强大&#xff0c;主要包含三个部分&#xff1a;…

LeetCode 1974. 使用特殊打字机键入单词的最少时间

文章目录1. 题目2. 解题1. 题目 有一个特殊打字机&#xff0c;它由一个 圆盘 和一个 指针 组成&#xff0c; 圆盘上标有小写英文字母 ‘a’ 到 ‘z’。 只有 当指针指向某个字母时&#xff0c;它才能被键入。指针 初始时 指向字符 ‘a’ 。 每一秒钟&#xff0c;你可以执行以…