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;
}
!!恭喜你完成第一天的修仙之旅!!