题目描述
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
- 输入: n = 3
- 输出: 6
示例 2:
- 输入: n = 9
- 输出: 45
限制:1 <= n <= 10000
题解
方法一: 求和公式 + 位运算
f(n)= n + (n-1) +(n-2) + 1 = (n² + n)/2;
C#:
public class Solution
{
public int SumNums(int n)
{
int sum =(int) Math.Pow(n, 2) + n; // n² + n
return sum >>1; // 右移1位,相当于除以2
}
}
注意: Math.Pow(Double, Double) 的返回值是double类型的,此题要记得转换成 int。
方法二:内置函数Enumerable.Aggregate
Enumerable.Range(start, count): 生成指定范围内的整数的序列。
- 参数:
start, Int32, 序列中第一个整数的值。
count,Int32,要生成的顺序整数的数目。 - 返回, IEnumerable
C# 中的 IEnumerable 或 Visual Basic 中的 IEnumerable(Of Int32),其中包含某个范围的顺序整数。
Enumerable.Aggregate :累加器
C#:
public class Solution
{
public int SumNums(int n)
{
IEnumerable<int> sum = Enumerable.Range(0,n+1);
return sum.Aggregate((x,y)=>x+y);
//return Enumerable.Range(0,n+1).Aggregate((x,y)=>x+y);
}
}
方法三:逻辑运算&& + 递归
C#:
public class Solution
{
public int res = 0; // 递归,定义在函数体外
public int SumNums(int n)
{
bool x = n >1 && SumNums(n-1)>0; // 如果n > 1, 递归
res = res + n;
return res;
}
}