题目链接地址:
题目描述:
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入为一个整数n(1<= n<=100000)。
输出:
对应每个测试案例,
输出1+2+3+…+n的值。
样例输入:
3
5
样例输出:
6
15
解题思路:
刚看到这道题时,我感觉莫名其妙,怎么会有这么奇怪的题目。
求1+2+3+...+n,要求不能使用乘除法,如果直接用加法的话就要用到循环。
后来想了一下位运算,但是用位运算求和也要用到循环啊。。。
后来经范神指点,得出解法如下:
因为C++在实例化对象的时候,会调用类的构造函数,而static变量属于类,而不是某个具体的对象;所以可以在类中定义一个初始值为1的static变量n,每调用一次构造函数就令n++,再定义一个static变量sum用来保存1+2+3+…+n的结果即可。
注意C++类中的静态成员变量在使用前必须先进行初始化操作,否则程序运行时会报错,详情请看 C++ 类的静态成员详细讲解
AC代码如下:
#include<stdio.h>
class Add
{
private:
// n和sum都定义为静态成员变量,这样能够被所有类的实例对象所共享,也就能保存累加的中间结果
static long long n;
static long long sum;
public:
// Add类的构造函数,在这里面做加法操作
Add()
{
n++;
sum += n;
}
// 因为n和sum是static类型变量,会保留上次运算所得到的结果,所以在做的累加运算前,要对n和sum进行复位操作
static void reset()
{
n = 0;
sum = 0;
}
// 返回累加和sum
static long long getSum()
{
return sum;
}
};
// 使用静态成员变量必须先进行初始化操作,否则程序运行时会报错
// C++类的静态成员变量初始化操作只能在类的外面进行
long long Add::n = 0;
long long Add::sum = 0;
/**
* 获取1到n的和,在Add构造函数中进行加法操作,申请n个Add对象,则会调用n次Add的构造函数
* @param n n为输入的数
* @return long long sum 返回1~n的累加和,因为n的数据很大,所以sum用long long存储,防止溢出
*/
long long getSumOfOneToN(int n)
{
long long sum;
Add::reset();
Add * add = new Add[n]; // 申请一个大小为n的Add对象数组,这样会调用n次Add类的构造函数
delete [] add; // 释放Add对象数组,new[]/delete[] 要配对使用
sum = Add::getSum();
return sum;
}
int main()
{
int n;
long long sum;
while(EOF != scanf("%d",&n))
{
sum = getSumOfOneToN(n);
printf("%lld\n",sum);
}
return 0;
}
/**************************************************************
Problem: 1506
User: blueshell
Language: C++
Result: Accepted
Time:120 ms
Memory:1024 kb
****************************************************************/