C++ 和级数阶乘
C++ sum series factorial
我们应该得到一个总和系列,但我 运行 遇到了问题。
1/n + 2/n-1 + 3/n-2 ...n/1就是她想要的总和
我的 for 循环不正确,我不知道为什么
答案应该是 8.70 但我得到 27.
#include <iostream>
using namespace std;
int main()
{
int n=5;
float sum=0;
for(int i=1; i<=n; i++){
for(int j =n; j>0; j--){
sum += i/j;
}
}
cout<<"Sum : "<<sum;}
您正在使用两个循环来计算总和,而系列总和可以通过单个循环来计算。那应该是一个危险信号。
此外,您正在使用整数除法。那会给你错误的结果。
使用:
#include <iostream>
using namespace std;
int main()
{
int n=5;
float sum=0;
for(int i=1; i <= n; i++)
{
sum += i*1.0f/(n - i + 1);
}
cout<<"Sum : "<<sum;
}
不需要先有两个for循环,一个循环就可以了
int main(){
float n=5; //need to declare as float otherwise the statement(i/n-1) will be 0 if declared as int
float sum=0;
for(int i=1; i<=n-1; i++){ //the loop should go to n-1 only otherwise denominator becomes 0 which makes it Infinity
sum += (i/(n-i));
}
cout<<"Sum : "<<sum;
}
}
我希望这也能解答你的疑问@isabella
您也可以使用一些模板元编程来完成。然后总和将具有零运行成本。
#include <iostream>
template < int n, int i = n >
struct sum
{
static double value()
{
return i*1.0f/(n - i + 1) + sum<n, i-1>::value();
}
};
template < int n >
struct sum < n, 0 >
{
static double value() { return 0; }
};
int main()
{
std::cout << "Sum : " << sum<5>::value() << '\n';
}
使用两个 for 循环不符合您的目的,因为内部循环将重复外部循环指定的次数。在您的情况下,您将获得:
1/1 + 1/2 + 1/3 + 1/4 + 1/5
+ 2/1 + 2/2 + 2/3 + 2/4 + 2/5
+ 3/1 + 3/2 + 3/3 + 3/4 + 3/5
+ 4/1 + 4/2 + 4/3 + 4/4 + 4/5
+ 5/1 + 5/2 + 5/3 + 5/4 + 5/5
+ 1/1 + 1/2 + 1/3 + 1/4 + 5/5
但是,您需要 i
和 j
并行工作,如下所示:
#include <iostream>
using namespace std;
int main()
{
int n;
float sum = 0;
cout << "\n Enter n: ";
cin >> n;
for (int i = 1, j = n; i <= n; ++i, --j)
{
sum += (float)i/j;
}
cout << "\n\n Sum is " << sum;
}
另请注意,int/int
将导致 int
。例如:9/2
是 4
。因此,您需要将其中一个操作数转换为 float
以获得 float
结果。
到目前为止,您可以通过不同的方法解决此问题。由于您使用的是C++语言,因此您可以在此处采用在打印十进制数后使用'fixed'位的概念。
Here the code of your desire question.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n=5;
double sum=0,j = 1.00000;
for(int i=n; i >= 1; i--)
{
sum += i*j/(n - i + 1);
}
cout<<" Sum : " << setprecision(1) << fixed << sum << endl;
}
我们应该得到一个总和系列,但我 运行 遇到了问题。
1/n + 2/n-1 + 3/n-2 ...n/1就是她想要的总和
我的 for 循环不正确,我不知道为什么 答案应该是 8.70 但我得到 27.
#include <iostream>
using namespace std;
int main()
{
int n=5;
float sum=0;
for(int i=1; i<=n; i++){
for(int j =n; j>0; j--){
sum += i/j;
}
}
cout<<"Sum : "<<sum;}
您正在使用两个循环来计算总和,而系列总和可以通过单个循环来计算。那应该是一个危险信号。
此外,您正在使用整数除法。那会给你错误的结果。
使用:
#include <iostream>
using namespace std;
int main()
{
int n=5;
float sum=0;
for(int i=1; i <= n; i++)
{
sum += i*1.0f/(n - i + 1);
}
cout<<"Sum : "<<sum;
}
不需要先有两个for循环,一个循环就可以了
int main(){
float n=5; //need to declare as float otherwise the statement(i/n-1) will be 0 if declared as int
float sum=0;
for(int i=1; i<=n-1; i++){ //the loop should go to n-1 only otherwise denominator becomes 0 which makes it Infinity
sum += (i/(n-i));
}
cout<<"Sum : "<<sum;
}
}
我希望这也能解答你的疑问@isabella
您也可以使用一些模板元编程来完成。然后总和将具有零运行成本。
#include <iostream>
template < int n, int i = n >
struct sum
{
static double value()
{
return i*1.0f/(n - i + 1) + sum<n, i-1>::value();
}
};
template < int n >
struct sum < n, 0 >
{
static double value() { return 0; }
};
int main()
{
std::cout << "Sum : " << sum<5>::value() << '\n';
}
使用两个 for 循环不符合您的目的,因为内部循环将重复外部循环指定的次数。在您的情况下,您将获得:
1/1 + 1/2 + 1/3 + 1/4 + 1/5
+ 2/1 + 2/2 + 2/3 + 2/4 + 2/5
+ 3/1 + 3/2 + 3/3 + 3/4 + 3/5
+ 4/1 + 4/2 + 4/3 + 4/4 + 4/5
+ 5/1 + 5/2 + 5/3 + 5/4 + 5/5
+ 1/1 + 1/2 + 1/3 + 1/4 + 5/5
但是,您需要 i
和 j
并行工作,如下所示:
#include <iostream>
using namespace std;
int main()
{
int n;
float sum = 0;
cout << "\n Enter n: ";
cin >> n;
for (int i = 1, j = n; i <= n; ++i, --j)
{
sum += (float)i/j;
}
cout << "\n\n Sum is " << sum;
}
另请注意,int/int
将导致 int
。例如:9/2
是 4
。因此,您需要将其中一个操作数转换为 float
以获得 float
结果。
到目前为止,您可以通过不同的方法解决此问题。由于您使用的是C++语言,因此您可以在此处采用在打印十进制数后使用'fixed'位的概念。
Here the code of your desire question.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n=5;
double sum=0,j = 1.00000;
for(int i=n; i >= 1; i--)
{
sum += i*j/(n - i + 1);
}
cout<<" Sum : " << setprecision(1) << fixed << sum << endl;
}