所以我最近在c ++中创建了一个简单的计算器,除其他外,它可以计算指数,但它只能工作到2 ^ 31。 这是问题,我的输入/输出如下:
I: 2^31
O: 131072
I: 2^32
O: 0
I: 13107*2
O: 262144
基本上它不能做2 ^ 32但它可以做(2 ^ 31)* 2,我只是无法理解为什么。如果有人可以帮助我解释为什么我会真的很感激它。这是计算指数的代码btw:
long exp(long x, int y) {
int p;
if (y % 2 == 0) {
p = 1;
}
else {
p = x;
}
while (y > 1) {
x *= x;
y /= 2;
}
return x*p;
}
答案 0 :(得分:3)
即使是小数字,您的功能也会产生错误的结果。 考虑:
std::cout << exp(2,4); // 16
std::cout << exp(2,5); // 32
std::cout << exp(2,6); // 16 ???
首先你需要修复函数的实现,第二个使用能够代表更大数字的更大类型:
long long exp(long long x, int y)
{
long long result = x;
while(--y)
{
result*=x;
}
return result;
}
编辑:注意它只适用于正数。
另请注意,C ++中没有内置的“power operator”。 Operator ^
称为XOR运算符,它对两个数字执行按位运算。
注意:
int x = 0b101'111; //47
int y = 0b110'010; //50
//x^y = 0b011'101
std::cout << (x^y); //outputs 29
如果只设置了一对位中的一个,则XOR运算符结果中的每个位都置1,否则为0.
x: 0 1 0 1
y: 0 0 1 1
result: 0 1 1 0
答案 1 :(得分:0)
通过将“long”变为“long long”,我设法代表2 ^ 32。
人们指出的另一个问题是2 ^ 31是错误的,那是因为我没有考虑到即使 y 启动甚至它也可以在以后成为事实除以2时奇数,然后当你再次潜水2时,它将比它应该减少一个周期。
编辑:我设法修复它,如果有人对此感兴趣,那么代码现在看起来如何:EX:y = 6&gt;&gt; 6/2 = 3&gt; 3/2 = 1
long long exp(long long x, int y) {
int p = 1;
while (y > 1) {
if (y % 2 != 0) {
p *= x;
}
x *= x;
y /= 2;
}
return x*p;
}
从我看到它似乎正在发挥作用。