44.1+2+3+...+n

求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;
编译器不会做类型转换。

你可能感兴趣的:(44.1+2+3+...+n)