题目描述:
给出一个16位二进制数的原码,能够得到该数的补码。
输入格式:
一个只包含0和1的16位字符串,表示整数的原码。
输出格式:
输入的整数的补码,用只包含0和1的16位字符串表示。
请注意行尾输出换行。
样例输入:
样例1 1000000000011111 样例2 1000000000000000
样例输出:
样例1 1111111111100001 样例2 0000000000000000
提示:
补码:正数的补码不变,负数的补码是转成二进制后,除最高位的符号位外的各位取反再加1。
最高( 左)位为符号号,0开头表示是正数,1开头表示是负数。
具体参看baidu。
样例2解释:
先原码变成反码是1111111111111111,然后+1,要进位就全部变成0了。
时间限制: 1000ms
空间限制: 32MB
进制+高精度?
代码实现:
#include<bits/stdc++.h>
using namespace std;
string s;
//文心一言帮我打的二进制数计算函数
string addBinary(string a, string b) {
string result;
int carry = 0;
int i = a.size() - 1, j = b.size() - 1;
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
result.push_back(sum % 2 + '0');
carry = sum / 2;
}
reverse(result.begin(), result.end());
return result;
}
int main(){
cin>>s;
for(int i=0;i<16;i++){
if(i!=0){
s[i]=(s[i]=='0')?'1':'0';
}
}
if(s=="1111111111111111")cout<<"0000000000000000";
else{
s=addBinary(s,"1");
cout<<s;
}
return 0;
}