求表达式(1-1/2+1/3-1/4+......+1/n)的和
题目
编写代码,求表达式(1-1/2+1/3-1/4+…+1/n)的和
例如:当n=20时,表达式的值为0.668771
思路
1.“n”:scanf()函数获取
2.表达式的和sum:
关于2的执行思路可以看下面:
设置变量sum用来记录表达式1-1/2+1/3-1/4+…+1/n的和。
for()循环用i遍历1到n的数字,分别用1/i表示各项。
设置一个变量k,分别用1和-1来标记各项的正负,即用k*(1/i)进一步表示各项。
3.输出
代码
#include <stdio.h>
main()
{
double sum = 0;
int n;
int k = 1;
scanf("%d", &n);
for (float i = 1; i <= n; i++)
{
sum += k * (1 / i);
k = -k;
}
printf("%f\n",sum);
}
写的过程中想到的问题
1.关于sum到底用double型还是float型?
double是双精度浮点数,float是单精度浮点数,double型的精度大于float类型,适用于对于精度要求高的数据。
由题目示例可知,要保留六位,精度要求高。为减少错误,建议使用double型。
2.关于i到底用int型还是float型?
关于这个问题,主要影响的是 s += (1 / i) * k;语句中的输出结果。
如果int用int型,在保持式子(s += (1 / i) * k;)不变的情况下,1 / i仅保留整除的大小,即1/2=0,不符合题目要求。为避免此类问题,有以下两种处理方案:
- i用float型
- 将式子 s += (1 / i) * k; 改为 s += (1.0 / i) * k; 。
3.设置一个函数
#include <stdio.h>
float sum(int n)
{
double s = 0;
int k = 1;
for (float i = 1; i <= n; i++)
{
s += (1 / i) * k;
k = -k;
}
return s;
}
int main()
{
int n;
scanf("%d", &n);
printf("sum=%f\n", sum(n));
}