解法一:
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0;
int flag = 1;
for (i = 1; i <= 100; i++)
{
sum += flag * (1.0 / i);
flag = -flag;
}
printf("%lf", sum);
return 0;
}
易错点:sum的数据类型要是double,则除法的形式要是浮点类型的除法而不是整数类型的除法。
浮点型的除法要求除号左右两边至少有一个数是浮点数。观察式子可见分子都是1,这时只要给它改成1.0即可执行浮点型除法。
难点:
实现正负的交替运算。这里新建变量flag = 1,每一次循环中的加法结束就转换成-1。将其初始化在for循环语句外部,在一次for循环结束时不会被销毁,使的正负符号交替运算实现。
解法二:
通过数学算法转换为代码计算
这一题可以利用分组求和的方法,将偶数计算和奇数计算分开求和
这样就不用去写代码实现符号随相加次数增加而改变
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 != 0) //奇数 求和
sum += 1.0 / i;
else //偶数 求和
sum -= 1.0 / i;
}
printf("%lf", sum);
return 0;
}
类似的利用数学算法解决或者优化的例子还有这个:
当学到循环的时候很容易想到用循环解答
#include <stdio.h>
int main()
{
long long i = 0;
long long n = 0;
long long ret = 0; //这里都用更长的整型是为了计算更大的数
scanf("%lld", &n);
for (i = 1; i <= n; i++)
{
ret = ret + i;
}
printf("%lld", ret);
return 0;
}
这时用数学算法就可以大大优化算法
#include <stdio.h>
int main()
{
long long n = 0;
scanf("%lld", &n);
printf("%lld", (1 + n) * n / 2);
return 0;
}
这里用了等差数列求和公式