c++ 我没有得到答案,基数为10的整数的补数(LC-1009)[已关闭]

pdkcd3nj  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(93)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
9天前关闭。
Improve this question

//25. complement of a base 10 integer **important**
int n,answer=0;
cout<<"enter a number:";
cin>>n;
int m=~n;
int i=0;
while(n!=0){
    int bit=n&1;
    answer=(bit*pow(10,i))+answer;
    n>>1;
    i++;
}
int mask=0;
int j=1;
while(j<=i){
    mask=(mask<<1)|1;
    j++;
}
answer=mask&m;
cout<<answer;

我写了一段代码来得到一个整数值,比如5,也就是二进制的101,我应该得到010,它对应于010,它对应于2,但它不是这样的。

z0qdvdin

z0qdvdin1#

所提出的问题是高度模糊的,任何“补充”都应该是可逆的(这不是)。然而,在Leetcode问题的约束下(并且需要C++20),下面的代码应该可以解决它。

编辑:说明:假设你有一个整数n。然后(啊哈)“补数”正是填充交错0的补数。举例来说:

Original n:  101001
Complement:  010110

字符串
如果你把它们加在一起,你会得到(没有进位):

111111


所以“补数”是“全1”减去原来的数。
你可以用通常的方法得到“全1”,从2的下一个幂开始,然后减去1。这里不会发生溢出,因为从int转换为unsigned会留出空间乘以2。

# include <iostream>
# include <bit>              // requires C++20
using namespace std;

int complement( int n ){ return n ? 2 * bit_floor( unsigned(n) ) - 1 - n : 1; }

int main()
{
   for ( int n = 0; n < 32; n++ ) cout << n << " ----> " << complement( n ) << '\n';
}


输出(发现模式?):

0 ----> 1
1 ----> 0
2 ----> 1
3 ----> 0
4 ----> 3
5 ----> 2
6 ----> 1
7 ----> 0
8 ----> 7
9 ----> 6
10 ----> 5
11 ----> 4
12 ----> 3
13 ----> 2
14 ----> 1
15 ----> 0
16 ----> 15
17 ----> 14
18 ----> 13
19 ----> 12
20 ----> 11
21 ----> 10
22 ----> 9
23 ----> 8
24 ----> 7
25 ----> 6
26 ----> 5
27 ----> 4
28 ----> 3
29 ----> 2
30 ----> 1
31 ----> 0

laik7k3q

laik7k3q2#

下面的代码适用于您提供的示例。它不能解决零或负值(结果都是零)的模糊性。

#include <iostream>

using namespace std;

int main()
{
    int n = 0 ;
    cout << "enter a number:" ;
    cin >> n ;
    
    // Create mask of significant binary digits of n
    int bits = 0 ;
    for( unsigned a = n; a != 0;  a >>= 1, bits++ ) {}
    unsigned mask = ~(~0 << bits) ;
    
    // Complement and mask n
    int answer = (~n) & mask ;
    
    cout << answer ;

    return 0;
}

字符串
如果要求0 -> 1,则将其视为特殊情况:

unsigned mask = (bits == 0) ? 1u : ~(~0 << bits) ;

相关问题