牛客网刷题 | BC83 牛牛学数列

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

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

感谢阅读!

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


 描述

牛牛开始学习数列啦

现在他想知道1-2+3-4...+n的值

输入描述:

输入一个整数n (1≤𝑛≤1001≤n≤100)

输出描述:

输出一个整数

示例1


思路 :

题目中的数列公式 "1-2+3-4...+n" 表示一个交替正负号的数列,其中每个数字都是连续的自然数,但正负号根据数字的奇偶性交替变化。具体来说,数列的规律如下:

  • 第一个数字是 1,是正数。
  • 第二个数字是 2,是负数。
  • 第三个数字是 3,再次是正数。
  • 第四个数字是 4,是负数。

以此类推,直到给定的数 n。

因此,数列的前几项是这样的:

  • 当 n = 1 时,数列为 1。
  • 当 n = 2 时,数列为 1 - 2。
  • 当 n = 3 时,数列为 1 - 2 + 3。
  • 当 n = 4 时,数列为 1 - 2 + 3 - 4。

题目要求计算这个数列到 n 项的和。

为了计算这个数列的和,我们可以观察到一个规律:每两个连续的整数(一个正数和一个负数)的和是 -1。例如:

  • 1 - 2 = -1
  • 3 - 4 = -1

如果 n 是奇数,那么最后一个数是正数,整个数列的和将是 -(n/2) + n(因为前 n/2 对连续整数的和是 -1,而第 n 个数是正数)。 如果 n 是偶数,那么最后一个数是负数,整个数列的和将是 -(n/2)。

我们可以用数学公式来表示这个规律:

确定项数:首先,我们需要确定数列中有多少项。这个数量由输入的整数 n 决定。

计算对数:由于每对连续的正负数相加等于 -1,我们可以通过计算 n 中有多少对这样的连续项来确定数列和的主要部分。如果 n 是奇数,那么会有一个剩余的正数项;如果 n 是偶数,则所有项都成对。

应用公式:根据上述规律,我们可以得出以下公式来计算数列的和:

其中 // 表示整数除法,结果也是整数。

如果 n 是奇数,则数列的和为 -(n // 2) + n,因为前 n // 2 对连续整数的和是 -1,而第 n 个数是正数。

如果 n 是偶数,则数列的和为 -(n // 2),因为所有项都成对,每对的和为 -1


代码 1 :  

#include <stdio.h>  // 包含标准输入输出流库,用于程序中的输入输出操作。

#include <math.h>    // 包含标准数学库,这里用于调用pow函数来计算幂。

int value(int n)  // 定义一个名为value的函数,它接收一个整数参数n。
{
    int sum = 0;   // 在函数内部定义一个名为sum的整型变量,并初始化为0,用来累积数列的和。

    // 使用for循环遍历从1到n(包括n)的每个整数i。
    for(int i = 1; i <= n; i++)
    {
        // 对于每次循环,计算i乘以(-1)的(i+1)次方,这个结果决定了i的正负号。
        // pow(-1, (i+1))的计算结果根据(i+1)是奇数还是偶数来决定,奇数为-1,偶数为1。
        // 将这个结果与i相乘,然后加到sum上,从而累积数列的和。
        sum = i*pow(-1, (i+1)) + sum; 

        // 下面的注释掉的代码是另一种写法,与上面的非注释代码功能相同,但被注释掉了,所以不会执行。
        // sum += i*pow(-1,(i+1));  // 这行代码通过使用+=操作符来简化sum的更新,效果与上面的sum = ...相同。
    }
    
    return sum;  // 在循环结束后,返回累积的数列和。
}

int main()
{
    int n = 0;  // 在main函数中定义一个名为n的整型变量,用来存储用户输入的整数。

    // 使用scanf函数从标准输入读取一个整数,存储到变量n中。
    // %d是格式说明符,表示期望读取的是一个整数。
    scanf("%d", &n);

    // 调用value函数,将用户输入的整数n作为参数传递给该函数。
    // value函数将计算数列1-2+3-4...+n的和。
    // 然后,使用printf函数将计算得到的和打印出来。
    // %d是格式说明符,告诉printf函数期待输出的是一个整数。
    printf("%d\n", value(n));

    return 0;  // main函数返回0,表示程序正常结束。
}

代码 2 :

#include<stdio.h>
int main()
{
    int n=0,i=0,j=0;;
    scanf("%d",&n);
    i=n/2;
    j=n%2;
    if(j==0)
    //j=0代表为偶数,则全部抵消;
    {
        printf("%d",-i);
    }
    else
    //j=1代表为奇数,加上n;
    {
        printf("%d",n-i);
    }
}

代码 3 :

#include <stdio.h>

int calculate_sequence_sum(int n) {
    // 使用整数除法计算对数,即连续整数对的数量
    int pairs = n / 2;
    
    // 如果n是奇数,需要加上最后一个单独的正数项
    if (n % 2 != 0) {
        return -pairs + n;
    } else {
        // 如果n是偶数,所有项都成对,直接计算对数的相反数
        return -pairs;
    }
}

int main() {
    int n;
    printf("请输入整数n (1≤n≤1001): ");
    scanf("%d", &n); // 从用户那里读取输入的整数n

    int result = calculate_sequence_sum(n);
    printf("数列1-2+3-4...+%d的和为: %d\n", n, result);

    return 0;
}

知识点 :C 库函数 - pow()

描述

C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 xy。

声明

下面是 pow() 函数的声明。

double pow(double x, double y)

参数

  • x -- 代表基数的浮点值。
  • y -- 代表指数的浮点值。

返回值

该函数返回 x 的 y 次幂的结果。

实例

下面的实例演示了 pow() 函数的用法。

#include <stdio.h>
#include <math.h>

int main ()
{
   printf("值 8.0 ^ 3 = %lf\n", pow(8.0, 3));

   printf("值 3.05 ^ 1.98 = %lf", pow(3.05, 1.98));
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

值 8.0 ^ 3 = 512.000000
值 3.05 ^ 1.98 = 9.097324

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值