LC-1017. 负二进制转换
Posted Miraclo_acc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC-1017. 负二进制转换相关的知识,希望对你有一定的参考价值。
1017. 负二进制转换
难度中等71
给你一个整数 n
,以二进制字符串的形式返回该整数的 **负二进制(base -2
)**表示。
**注意,**除非字符串就是 "0"
,否则返回的字符串中不能含有前导零。
示例 1:
输入:n = 2
输出:"110"
解释:(-2)2 + (-2)1 = 2
示例 2:
输入:n = 3
输出:"111"
解释:(-2)2 + (-2)1 + (-2)0 = 3
示例 3:
输入:n = 4
输出:"100"
解释:(-2)2 = 4
提示:
0 <= n <= 109
class Solution
// 与转化为二进制没什么区别,都是除基取余,倒序排列。
// 不过负二进制的余数可能有0,1,-1,而表示上不能有负数,所以在余数为-1时,要转化为1,同时商+1即可
public String baseNeg2(int n)
if(n == 0) return "0";
StringBuilder sb = new StringBuilder();
while(n != 0)
int remain = n % (-2);
sb.append(Math.abs(remain));
n = remain < 0 ? n/(-2)+1 : n/(-2);
return sb.reverse().toString();
将负十进制转换为其二进制表示
【中文标题】将负十进制转换为其二进制表示【英文标题】:Turning a negative decimal into its binary representation 【发布时间】:2021-12-07 16:22:06 【问题描述】:我正在尝试找出一种方法,我可以从用户那里获取输入,并将其显示在 BinRep[] 数组中。目前这个程序只适用于正数,但是我很难找到一种方法让它也适用于负数。有什么想法吗?
int n = atoi(argv[1]);
int binRep[N];
int i;
int flippedNum;
for (i = 0; i < N; i++)
binRep[i] = 0;
i = 0;
while (n > 0)
binRep[i] = n % 2;
n = n / 2;
i++;
for (i = N - 1; i >= 0; i--)
printf("%d", binRep[i]);
printf("\n");
return 0;
【问题讨论】:
您了解带符号的数字如何用二进制表示 - 即二进制补码吗?一种方法是将正数转换为二进制,然后应用二进制补码来获得负表示。似乎您或编写代码的人可能已经按照未使用的flippedNum
变量所暗示的这些思路进行思考。
您是否只是想在二进制中显示与输入为正数相同的数字,但前面有一个-
?
没有。二进制输出应该是数字的正数。 IE -7 和 7 应该输出相同(二进制为 7)。
哦,那听起来你只需要添加n = abs(n);
。别忘了#include <math.h>
这就是我原本打算做的,但它似乎太简单了。输出是正确的,但我有一种可疑的感觉,由于某种原因它不会通过 GitHub autograder ......无论如何,感谢您的帮助!如果不允许,我想我会回信。
【参考方案1】:
unsigned int n = (unsigned int ) atoi( argv[1] );
unsigned int binRep[N];
应该工作
但负数将采用二进制补码表示。
【讨论】:
命令行输入必须是有效的有符号整数。这就是为什么我在其他方面遇到麻烦。 1.) 命令行的输入始终是char *
2.) atoi( argv[1] )
输出 int
3.) (unsigned int)
将此输出转换为 unsigned int
你能解释一下为什么这样有效吗?我希望能够完全理解和掌握它。
twos complement wikipedia 如果您无法理解我的评论,我会推荐“C 编程语言”
我阅读了 Wiki 文章和其他一些堆栈溢出帖子。我仍然没有完全掌握它,这似乎很重要。无论如何,你可以给我一个简短的说明为什么会这样吗?以上是关于LC-1017. 负二进制转换的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:166.数字转换为十六进制数