您可能熟悉有符号整数的二进制补码表示。它是当今最广泛使用的二进制整数表示。鲜为人知的是二进制整数表示的其他一些建议,包括基数-2。 Base -2具有二进制补码的算术便利性,可能更容易描述。 (见http://en.wikipedia.org/wiki/Signed_number_representations)
示例:1011是1 *( - 2)^ 3 + 0 *( - 2)^ 2 + 1 *( - 2)^ 1 + 1 *( - 2)* 0 = -8 + 0 + - 2 + 1 = -9
输入
第一个数字T(从1到100)是从基数-2转换为基数10的整数数。
下一个T号是基数-2(每个1到15位)。
注意:数字可以在左边填充0。
输出
输出数字的带符号的基数10表示,用空格分隔。
以下是我在C ++中的代码;它几乎只是使用上面的例子中的方法与1011.它在我自己的测试用例中工作正常,但是当我在在线评判中提交它时,它给出了错误的答案。我认为可能会溢出。有关如何改进我的代码的任何建议。谢谢!
#include<iostream>
#include<math.h>
using namespace std;
long long int convert (long long int base, long long int num){
long long int exp=0;
long long int output=0;
while (num != 0){
long long int digit = num - 10*int(num/10);
output += digit * pow(base, exp);
exp++;
num = int(num/10);
}
return output;
}
int main(){
int cases;
cin >> cases;
long long int input;
long long int base = -2;
cin >> input;
cout << convert(base, input);
for (int i=1; i< cases; i++){
cin >> input;
cout << " " << convert(base, input);
}
return 0;
}
答案 0 :(得分:2)
数字是一个可以用手指表达的抽象概念。
Arithmetics以不同的方式指示该抽象数字的表示,称为编号系统。
因此,如果您更喜欢,可以将数字映射到一串数字或一系列数字。
您定义的函数转换,取一个数字和一个基数并将其转换为数字。因此,它不会将该数字表示为数字序列。
答案 1 :(得分:2)
正如你所说,最好的想法是阅读这个问题:
“第一个数字T(从1到100)是从基数-2转换为基数10的整数数。” 这里似乎有许多要转换的整数。
“下一个T号是基数-2。”
所以有些T号应该用-2来解释。
“每个人都有1到15位数。”
“注意:数字可以在左边填充0。”
“输出
输出数字的带符号基数10表示,用空格分隔。“
所以你有一个有价值的T.比如说它是34岁。 Ater你在基数-2中有34个数字。 每个都有1到15位数字。这些可以用0填充在左边。
所以你必须选择每个数字的表示(它是一个字符串吗?)。
您必须将基数-2中表示的34个数字转换为基数10,并用空格分隔34个数字。