题目:
两种方法:
法一:for循环直接法
各项正负交替,故可定义变量flag并初始化为1,在每次循环后取其相反数。
各项分子均为1,分母为依次递增的奇数,故分子可看作flag,分母为2*n-1。
定义循环变量i并初始化为1,循环次数为n的值。
定义浮点型sum并初始化为0,储存每次循环相加的结果。
法二:函数递归调用
定义函数double f (int n),利用if-else语句区分各种不同的情况。
n为1时:函数返回1。
n为不等于1的偶数时:函数返回f(n-1)-1/(2*n-1)。
n为不等于1的奇数时:函数返回f(n-1)+1/(2*n-1)。
法一代码
#define _CRT_SECURE_NO_WARNINGS//避免VS2022中scanf报错
#include<stdio.h>
int main()
{
double sum = 0, flag = 1;//注意flag为浮点型,否则会在for循环中相除时导致数据丢失
int n; //因为返回值是浮点型数据,所以分子分母必须有一个是浮点型数据,相除的结果才会为浮点型数据(第11行)
printf("输入正整数n的值:");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
sum = sum + flag / (2 * i - 1);
flag = -flag;
}
printf("%.2f\n", sum);
return 0;
}
法二代码
#include<stdio.h>
double f(int n)
{
if (n == 1)
return 1;
else if (n != 1 && n % 2 == 0)
return f(n - 1) - 1.0 / (2 * n - 1);//这里需要特别注意的是分子要写成1.0而不能写成1
else //因为返回值是浮点型数据,所以分子分母必须有一个是浮点型数据,相除的结果才会为浮点型数据
return f(n - 1) + 1.0 / (2 * n - 1);
}
int main()
{
int n;
printf("输入正整数n的值:");
scanf("%d", &n);
double sum = f(n);
printf("%.2f\n", sum);
return 0;
}