题目描述
此题目来自于剑指offer 64
题目描述:求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
思路
可以直接用小学学过的高斯公式:前n项和等于(首项+末项) * 项数 / 2
即
class Solution {
public:
int sumNums(int n) {
return (1 + n) * n / 2;
}
};
但是由于题目要求不能使用乘除法所以此方案也不行。
所以我们可以使用math里面的库,或者使用递归等其他办法来解决。
使用pow
由于我们知道其答案就是n * (n + 1) / 2,拆解就是 (n ^ 2 + n) / 2
故可以使用
double pow(double x, double y);
这个函数返回x的y次幂,但是需要注意的一点是:pow返回的类型为double,然而函数需要返回int所以还需要强制类型转换才可。
class Solution {
public:
int sumNums(int n) {
return (int)(pow(n, 2) + n) >> 1;
}
};
递归
运用条件表达式短路的性质:
A && B 如果A是false,B不执行
A || B 如果A是true,B不执行
class Solution {
public:
int sumNums(int n) {
int res = n;
n && (res += sumNums(n - 1));
return res;
}
};
数组求大小
建立一个大小为 n * (n + 1)的数组,返回其大小的一般即可
代码如下(示例):
class Solution {
public:
int sumNums(int n) {
char res[n][n + 1];
return sizeof(res) >> 1;
}
};
静态成员变量实现累加
静态成员在类内声明,类外定义。
类中的所有成员共用一个静态成员变量。所以可以在构造函数中对其进行累加。
代码如下(示例):
class Temp {
public:
static int sum;
static int s;
Temp() {
++s;
sum += s;
}
};
int Temp::sum = 0;
int Temp::s = 0;
class Solution {
public:
int sumNums(int n) {
vector<Temp> tmp(n);
int res = Temp::sum;
Temp::sum = 0;
Temp::s = 0;
return res;
}
};
# 总结 这道题其实并不偏向算法,反而更偏向于语法一些。