我编写了以下代码来汇总系列(-1)^i*(i/(i+1))
。但是当我运行它时,我得到任何n值的-1
。
有人可以指出我做错了什么吗?提前谢谢!
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int i = 1.0;
int n = 5.0;
for(i=1;i<=n;i++)
sum = (-1)^i*(i/(i+1));
cout << "Sum" <<" = "<< sum << endl;
return 0;
}
答案 0 :(得分:14)
问题#1: C ++ ^
运算符不是数学运算符。这是一个按位异或。
您应该使用pow()
代替。
问题#2: 您将浮点类型存储为整数类型。因此,以下内容将导致integer division (truncated division):
i/(i+1)
问题#3: 你实际上并没有总结任何事情:
sum = ...
应该是:
sum += ...
代码的更正版本如下:
double sum = 0;
int i = 1;
int n = 5;
for(i = 1; i <= n; i++)
sum += pow(-1.,(double)i) * ((double)i / (i + 1));
虽然在这种情况下你真的不需要使用pow
。奇数/偶数的简单测试就可以了。
double sum = 0;
int i = 1;
int n = 5;
for(i = 1; i <= n; i++){
double val = (double)i / (i + 1);
if (i % 2 != 0){
val *= -1.;
}
sum += val;
}
答案 1 :(得分:4)
你需要把sum + = pow(-1,i)*(i /(i + 1));
否则每次都会失去以前的结果。
使用pow功能进行动作操作。
编辑:如在其他帖子中所述,使用double或float而不是int来避免截断分割。
答案 2 :(得分:3)
这个怎么样
((i % 2) == 0 ? 1 : -1)
而不是
std::pow(-1, i)
完整答案:
double sum = 0;
int i = 1.0;
int n = 5.0;
for (i = 1; i <= n; ++i) {
signed char sign = ((i % 2) == 0 ? 1 : -1);
sum += sign * (i / (i+1));
}
答案 3 :(得分:2)
几个问题:
^是按位排他或在c ++中没有“提升到电源”。使用pow()方法。
从最后一行移除悬空开口支架
分配给整数时,使用不浮动的内容。
答案 4 :(得分:2)
您的代码似乎有些问题:
using namespace std;
这与您手头的问题没有直接关系,但不要说using namespace std;
它会引入微妙的错误。
int i = 1.0;
int n = 5.0;
您正在使用浮点常量初始化整数变量。尝试
int i = 1;
int n = 5;
sum = (-1)^i*(i/(i+1));
此表达式存在两个问题。首先,数量(i/(i+1))
始终为零。请记住将结果分成两个int
轮。其次,^
没有按照你的想法做到。它是独占或运算符,而不是取幂运算符。第三,^
的绑定比*
更紧密,所以你的表达式是:
-1 xor (i * (i/(i+1)))
-1 xor (i * 0)
-1 xor 0
-1
答案 5 :(得分:1)
^
没有按照您的想法行事。您的代码中还有其他一些错误。
应该是什么:
#include <iostream>
#include <cmath>
int main( )
{
long sum = 0;
int i = 1;
int n = 5;
for( i = 1; i <= n; i++ )
sum += std::pow( -1.f, i ) * ( i / ( i + 1 ) );
std::cout << "Sum = " << sum << std::endl;
return 0;
}
要获取值的力量,请使用std::pow
(see here)。此外,您无法将int
分配给小数值。为此,您需要使用float
或double
。
前面提到的^
是一个按位异或,而不是指数的标记。
另外请注意Integer Arithmetic,因为您可能会得到意想不到的结果。您最有可能希望将变量更改为float
或double
。
答案 6 :(得分:1)
代码存在一些问题:
int sum = 0;
中间结果不是整数,这应该是双重
int i = 1.0;
由于你将在一个除法中使用它,它应该是一个双精度数,如果以整数计算,则1/2为0。
int n = 5.0;
这是一个int,不是浮点值,不需要.0。
for(i=1;i<=n;i++)
你已经将i初始化为1,为什么要再次?
sum = (-1)^i*(i/(i+1));
每次迭代都会丢失之前的值,您应该使用sum + ='new values'
此外,您不需要pow来计算(-1)^i
,所有这一切都在+1和-1之间切换,具体取决于i
的奇数/偶数状态。您可以使用if
语句或使用2 for
来更轻松地完成此操作,其中一个用于奇数i
一个用于偶数...真的很多选择。