我正在尝试使用以下程序计算“2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ 14”(我是一个新手,只能通过乘以自己来计算指数一定时间)。结果应该是32767,但我跑了它并获得了270566475,我想了很久但无法弄清楚为什么......
#include <stdio.h>
int main(void)
{
int i, e, exponent, sum;
e = 1;
exponent = 1;
sum = 1;
for (i = 1; i <=14; i++)
{
for (e = 1; e <= i; e++)
{
exponent *= 2;
}
sum += exponent;
}
printf("%d\n", sum);
return 0;
}
这有什么问题?感谢!!!
答案 0 :(得分:7)
您不需要内循环。只需在外循环内直接执行exponent *= 2
一次。顺便说一下,我认为你必须在<{em> sum += ...
之后 。
此外,您可以从sum = 0
和i = 0
开始,这更接近您所描述的数学。
答案 1 :(得分:2)
单独看看你的内环。它正在尝试计算i
,2^i
的一个特定值。
但exponent
每次都不会从1
开始。所以你进入那个循环,exponent
已经有了一些非常大的价值。
for (i = 1; i <=14; i++)
{
exponent = 1;
for (e = 1; e <= i; e++)
{
exponent *= 2;
}
sum += exponent;
}
现在你已经为每个2的新功率重置exponent
(很明显,除了计算结果之外,它不是指数)。
答案 2 :(得分:2)
如果你有权创建一个函数,最好用递归函数来做这个:
#include <stdio.h>
int power(int x, int exp) {
if (exp == 0)
return 1;
else
return x * power(x, exp-1);
}
int main (int argc, const char * argv[])
{
int i;
int sum = 0;
for (i = 0; i <= 14; i++) {
sum += power(2, i);
}
printf("%d",sum);
return 0;
}
我希望它有所帮助。
你只需要一个循环,因为每个循环都有n-1值的结果。我纠正了你的代码。
#include <stdio.h>
int main (int argc, const char * argv[])
{
int i, e, exponent, sum;
e = 1;
exponent = 1;
sum = 1;
for (i = 1; i <= 14; i++)
{
exponent *= 2;
sum += exponent;
}
printf("%d\n", sum);
return 0;
}
两个代码都有效