我想找到以下系列的第n个词的总和:
(1/2)+((1 * 3)/(2 * 4))+((1 * 3 * 5)/(2 * 4 * 6))....
所以,我用c ++编写了以下程序:
#include <bits/stdc++.h>
#include <conio.h>
using namespace std;
int main()
{
int p=1, k=1, n=0;
float h=0;
cout<<"Enter the term: ";
cin>>n;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
p*=((2*j)-1);
k*=(2*j);
}
h+=(p/k);
p=1;
k=1;
}
cout<<"The sum is : "<<h;
return 0;
getch();
}
然而,程序的输出总是给我'0'。我无法弄清楚程序的问题。
N.B。我是编程新手。
答案 0 :(得分:0)
此处的问题是,您尚未将p
和k
声明为float
或double
,或者在计算和分配给{{{ 1}}。
由于h
和p < k
都被声明为p
,k
,因此循环int
的每次迭代(问题的性质)都会发生什么事情。 }。所以你只需要为每次迭代求和0。
将p / k = 0
和p
声明为k
或float
或执行此操作:
double
此外,对于这个特定的问题,我假设你正在寻找精确度,所以要小心并同时研究Should I use double or float?
答案 1 :(得分:0)
隐式转换和类型转换是所有新手都陷入困境的陷阱。 在指示中:
h += p/k;
编译器首先执行整数除法,然后将结果提升为浮点类型。 从那时起:
p < k ; for all i,j < n
然后:
res = (p / k) < 1 => truncates to 0; // by integer division
因此:
sum(1->n) of p/k = sum (1->n) 0 = 0;
最后:
h = conversion to float of (0) = 0.0f;
这就是为什么你最后得到0.0f的结果。
解决方案:
1-首先,你需要使用自然类型作为c ++的浮点数,这是&#34; double&#34; (在引擎盖下c ++将float提升为double,所以直接使用它。)
2-将所有变量声明为double,除了术语数n:
3-术语数量永远不会为负数,您需要在代码中将其声明为无符号整数。
4-如果你做第3步,一定要抓住溢出错误,也就是说,如果用户输入一个负数,那么在&#34; n&#34;中排除一个非常大的数字的风险,驱逐:n = - 1转换为0xffffffff正数。
5-设计你的代码有时会更好。
6-仅包含您需要的标头,并避免在全局命名空间中导入任何名称空间。
以下是我认为您应该编写程序的方式。
#include <iostream>
double sum_serie(unsigned int n)
{
double prod = 1.0, sum = 0.0;
for (double c=1; c<=n ; c++)
{
prod *= ( ( 2*c ) - 1 ) / ( 2*c ); // remark the parenthesis
sum += prod;
}
return sum;
}
int main()
{
unsigned int n = 0;
int temp = 0;
std::cout << " enter the number of terms n: ";
std::cin >> temp;
if (temp > 0)
n = temp; // this is how you catch overflow
else
{
std::cout << " n < 0, no result calculated " << std::endl;
return 0;
}
std::cout << " the result is sum = " << sum_serie(n) << std::endl;
return 0;
}
我知道问题是关于C ++中的隐式转换和转换,但即使编写代码的方式也可以向您展示它中存在的错误,因此请尝试学习将您的想法表达为代码的正确方法,之后调试很自然。
祝你好运