牛客网刷题 | BC85 牛牛学数列3

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

牛牛准备继续进阶,计算更难的数列

输入一个整数n,计算 1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...((-1)^(n-1))*(2n-1))的值

输入描述:

输入一个整数

输出描述:

输出一个浮点数,保留3位小数


题目解析 :

数列的公式是:

1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...((-1)^(n-1))*(2n-1))

这个数列的每一项可以看作是一个分数,分子是1,分母是一个由奇数构成的序列,奇数的符号取决于项的位置是奇数还是偶数。具体来说:

  • 当项的位置是奇数时,分母是正的奇数。
  • 当项的位置是偶数时,分母是负的奇数。

因此,第k项可以表示为:


代码 1  : 

别被难住了,分母看上去很长的样子,但如果我们仔细看,就会发现是 1-1/2+1/3这样,既然如此那代码就很简单了。

#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0;
    double sum = 0;
    double q = 2.0;
    scanf("%d",&i);
    for(double j = 1;j<=i;j++)
    {
        if(fmod(j, q) !=0)
        {
            sum += (1/j);
        }
        else
            sum -= (1/j);
    }
    printf("%.3lf\n",sum);
    return 0;
}

代码 2 :

//仔细观察不难发现分母其实是有规律的,我们不妨设一个变量来表示不断变化的分母
#include<stdio.h>
int main()
{
    int n,denominator=0,i;
    float sum=0;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        i%2==0?(denominator-=2*i-1):(denominator+=2*i-1);
        sum+=1.0/denominator;
    }
    printf("%.3f\n",sum);
    return 0;
}

代码 3 :

#include <stdio.h>

// 函数用于计算数列的第k项
double sequence_term(int k) {
    // 根据k的奇偶性,交替使用正负号
    double sign = (k % 2 == 0) ? 1 : -1;
    // 计算第k项的分母,即(2k-1)
    double denominator = sign * (2 * k - 1);
    // 返回第k项的值,分子是1
    return 1.0 / denominator;
}

// 函数用于计算数列的和
double calculate_sequence_sum(int n) {
    double sum = 0.0; // 用于累加数列的和
    for (int k = 1; k <= n; ++k) {
        // 计算第k项,并累加到总和中
        sum += sequence_term(k);
    }
    return sum;
}

int main() {
    int n;
    // 读取用户输入的整数n
    printf("请输入一个整数n:");
    scanf("%d", &n);

    // 计算数列的和
    double sum = calculate_sequence_sum(n);

    // 输出结果,保留三位小数
    printf("数列的和为:%.3f\n", sum);

    return 0; // 程序结束
}

代码 4 :

#include<stdio.h> // 引入标准输入输出库
#include<math.h>  // 引入数学库,这里实际上不需要math.h

int main() {
    int i = 0; // 声明一个整型变量i,用于存储项数
    double sum = 0; // 声明一个双精度浮点数变量sum,用于累加数列的和
    double q = 2.0; // 声明一个双精度浮点数变量q,实际上这里q的值应该是2,不需要是浮点数

    scanf("%d", &i); // 从标准输入读取一个整数,存储在变量i中

    for(double j = 1; j <= i; j++) { // 开始一个for循环,从1迭代到i
        // 修正逻辑:直接检查j是否为奇数,而不是使用fmod
        if((int)j % 2 != 0) { // 如果j是奇数
            sum += 1 / j; // 累加正项
        } else { // 如果j是偶数
            sum -= 1 / j; // 累加负项
        }
    }

    printf("%.3lf\n", sum); // 打印结果,保留三位小数
    return 0; // 程序执行成功,返回0
}

知识点:pow函数

详见这篇文章

牛客网刷题 | BC83 牛牛学数列-CSDN博客

数列和序列:理解数列的概念,即一系列按照一定规律排列的数。

数学公式解析:解析给定的数学公式,并理解其数学意义。

条件表达式:使用条件表达式来确定数列中各项的符号,这涉及到奇偶性判断。

循环结构:使用循环结构来遍历数列的每一项,计算其值。

函数调用:在C语言中,使用 pow 函数来计算幂运算。

类型转换:在C语言中,进行类型转换以确保数学表达式中运算的准确性,例如,确保在进行除法运算时,至少有一个操作数是 double 类型。

输入输出操作:使用 scanf 进行输入操作,使用 printf 进行输出操作。

浮点数精度:处理浮点数时,理解精度问题,以及如何使用 %.3f 格式化输出来保留三位小数。

算法逻辑:设计算法来计算数列的和,这需要对数列的规律有清晰的认识。

代码结构:理解C语言的基本结构,包括函数定义、循环、条件语句等。

数学规律:识别并利用数学规律简化计算过程,例如,通过观察可以发现数列的符号交替出现,分母是递增的奇数。

  

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值