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;//奇数情况elsesum = 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;
}
!!恭喜你完成第一天的修仙之旅!!