九度OJ-题目1506:求1+2+3+...+n

题目链接地址:

九度OJ-题目1506:求1+2+3+...+n


题目描述:
求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
 
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
****************************************************************/


你可能感兴趣的:(九度OJ-剑指Offer)