求1+2+3+...+n
- 参与人数:2683时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
求
1+2+3+...+n除了用公式n( n + 1 ) / 2之外,无外乎循环和递归,由于明确限制for和while的使用,循环已经不能用了,递归需要用if来判断出口条件,题目同样不允许使用。
我们可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数会被执行n次,可以将累加的相关代码写在构造函数里。
// 44.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
class Solution {
public:
class StaticTmp
{
public:
StaticTmp(){
++n;
sum += n;
}
static void reset(){
n = 0;
sum = 0;
}
static int getNum(){
return sum;
}
private:
static unsigned int n;
static unsigned int sum;
};
public:
int Sum_Solution(int n) {
StaticTmp::reset();
StaticTmp* tmp = new StaticTmp[n];
return StaticTmp::getNum();
}
};
unsigned int Solution::StaticTmp::n = 0;
unsigned int Solution::StaticTmp::sum = 0;
int _tmain(int argc, _TCHAR* argv[])
{
Solution s;
int result = s.Sum_Solution(100);
return 0;
}
我在Solution类里面定义了StaticTmp类,这种类中类的写法并不稀罕,在其他工程中见过,
注意StaticTmp类的静态成员变量必须在StaticTmp类的外面初始化,编译器对静态成员变量的初始化要求非常严格,n和sum被声明为unsigned int,那么初始化必须是unsigned int
,下面这种写法是错误的
int Solution::StaticTmp::n = 0;
int Solution::StaticTmp::sum = 0;
编译器不会做类型转换。