当前位置: 首页 > article >正文

day1 —— 拿捏1~n的求和问题

目录

前言

问题描述

代码解释


前言

1.若是想要了解基本语法的话,请到(7条消息) C语言从练气期到渡劫期_要一杯卡布奇诺的博客-CSDN博客查看相应的语法细节

2.若是想要自己保存文章的话,请到有道云笔记保存

问题描述

        求1+2+3+……+n的结果(1 <= n <= 10000

        问题链接:力扣

代码解释

        法一:循环遍历【O(n)】

思路分析:循环枚举数组中的每个值,定义求和变量,让这个变量加上数组中的每个值

#include <stdio.h>

int sumNums(int n) 
{
    int sum = 0;
    for(int i=1; i<=n; i++)
        sum += i;//累加
    return sum;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        法二: 数学公式

思路分析:使用数学公式n*(n+1)/2,注意,直接使用可能会溢出,所以我们使用long long来定义sum

#include <stdio.h>

int sumNums(int n)
{
    long long sum = n * (n + 1) / 2;
    return sum;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        法三:递归

思路分析:递归,每次递归得到当前数和对下一个数的递归的和,到0的时候递归结束

#include <stdio.h>

int sumNums(int n)
{
    //递归结束条件
    if (n < 1)
        return 0;
    return n + sumNums(n - 1);
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        法四:数学公式(在不使用long long的情况下)

思路分析:

        1)n为奇数 ----> (n + 1) / 2 * n;

        2)n为偶数 ----> n / 2 * (n + 1);

#include <stdio.h>

int sumNums(int n)
{
    int sum = 0;
    if (n % 2)
        sum = (n + 1) / 2 * n;//奇数情况
    else
        sum = n / 2 * (n + 1);//偶数情况
    return sum;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        法五:库函数pow联合位运算

思路分析:本质上还是数学公式:(n^2 + n)/2;使用pow函数求出n^2,然后+n后右移1位【使用pow需要头文件math.h】

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

int sumNums(int n)
{
    return ((int)pow(n, 2) + n) >> 1;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        法六:短路逻辑运算和递归搭配使用

思路分析:x && y --> x为假,y不执行;x || y --> x为真,y不执行。了解了短路运算符后,我们就可以使用它和递归搭配使用了

#include <stdio.h>

int sumNums(int n)
{
    n && (n += sumNums(n - 1));
    return n;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", sumNums(n));
    return 0;
}

        !!恭喜你完成第一天的修仙之旅!!


http://www.kler.cn/a/884.html

相关文章:

  • UE材质节点Fresnel
  • python学opencv|读取图像(三十一)缩放图像的三种方法
  • 存储过程和触发器
  • 计算机网络之---应用层协议概述
  • 优先级队列(算法十四)
  • 熵权法(变异系数法)
  • Java中的异常
  • 《Spring Boot 趣味实战课》读书笔记(二)
  • 【webrtc】ICE 到VCMPacket的视频内存分配
  • 基于GPT-4的免费代码生成工具
  • Qt学习_08_用独立的文件存放样式表
  • Web漏洞-命令执行和代码执行漏洞
  • 百度终于要出手了?文心一言
  • 文心一言发布的个人看法
  • react的基础使用
  • 【每日一题】——网购
  • 双指针 -876. 链表的中间结点-leetcode
  • 【面试题系列】K8S常见面试题
  • 【vue.js】在网页中实现一个金属抛光质感的按钮
  • 有关pytorch的一些总结
  • 今年还能学java么?
  • 面试阿里测开岗失败后,被面试官在朋友圈吐槽了......
  • 多线程案例——阻塞队列
  • HTTP详解
  • 15000 字的 SQL 语句大全 第一部分
  • C语言格式和注意点