好几天没写题解了,今天难得没事,就回归下正途吧~1053是一道相对比较困难的题目,错误率是比较高的,那么就以这道题目来作为今天的题解吧
1053: 正弦函数
-
题目描述
image.png
输入x,计算上面公式的前10项和。
- 输入
输入一个实数x。 - 输出
输出一个实数,即数列的前10项和,结果保留3位小数。 - 参考代码:
#include<stdio.h>
int main()
{
int i;
double x, flag, sum, deno, numerator;
scanf("%lf", &x);
sum = 0.0;
deno = 1.0; //第一项的分母
numerator = x; //第一项的分子
flag = 1.0; //第一项的符号
for(i = 1; i <= 10; i++)
{
sum += numerator * flag / deno;
//为下一项的计算做准备
flag = -flag;
numerator = numerator * x * x;
deno = deno *(2 * i) * ( 2 * i + 1);
}
printf("%.3f\n", sum);
return 0;
}
- 代码解析:
这是一道类似数列找规律的题目,在开始做题前,我们要从公式出发进行分析。通过找规律,我们可以明显的分析出公式的规律是,x的y次方/y的阶乘,减或加,x的y+2次方/y+2的阶乘。x 是我们自己输入的实数,属于常量,而y是变量,会不断变化,每次+2,需要我们在循环中完成。
在开始写代码前,我们列出以下几点要素:
- 循环次数因固定为10次,因为题目只要计算前10项的和。
- y的初始值都为1,我们需要给他赋值。
- y的变化是在计算完毕后,所以我们在循环最后才完成增加。
- 每次循环都需要把这一项的值加入总和,也就是sum。
- 符号每次计算都会变化,或+ 或- ,我们这里用可以用1或者-1来代替符号,方便计算。
- 另外,分子是会不断变化的,所以我们输入的x是不能直接用于计算的,要赋值于第一个分子。
读懂以上几点要素,我们便可轻易写出上面的代码了。当然,为了大家阅读方便,我在相应的位置添加了注释。
至于deno = deno *(2 * i) * ( 2 * i + 1); 是阶乘的公式,如果不了解数学概念的可以看一下百科→https://baike.so.com/doc/5636551-5849178.html
网友评论