关闭

好玩的 1 + 2 + 3 + ... + n 求和问题

761人阅读 评论(0) 收藏 举报

    对于sum = 1+ 2 + 3 + ... + n 问题,我觉得任何一个学过C的人( 即使只会一点点点点点...)都会说  So Easy是吧,不过确实也是的,呵呵~但是如果仅仅是这样,那么就没有什么意思了是吧~ 好,现在来增加一些限制条件----->

                要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句!

 

    这样呢?呵呵~还会认为很简单么?虽然这个题目的意义不大,但是作为娱乐和开拓思维还是很可以的是吧!呵呵呵!

   我们知道,我们要求出sum,那么一般都是循环或者是递归也是可以的是吧!但是现在所有相关的“key”都是不可用的,那怎么办???

   

    #一:

       我们先从循环的角度来考虑呗!我们知道,要想求出来就必须是要进行循环或者递归的,这个思路是没有错的!但是:我们怎么样让他自己进行而不是我们来写代码处理,这样不就达到要求了么!呵呵呵!!!第一种方法:

    首先我认为(或者说假设 )C++大家已经学过了,那么类的性质应该是知道的是吧!那么C++中有什么是可以自动执行的呢!?呵呵~那不就是构造函数和析构函数这些呗!是吧~ 好,下面我们构建一个类:

   class A

   {

       static int m_n;  // 我们知道静态变量是跟着类走的

                        //,那么我们用此类声明的n个对象都是可以使用和改变的是吧

       static int m_sum;

    public:            // 当然前面我没有写private大家应该知道是什么意思,呵呵,人懒,就不改了哦~ 

       A();

       ~A(){}

      static int getSum();

   };

   int A::m_n =0;     // 注意要初始化变量

   intA:m_sum = 0; 

  

   A::A()

   {

      m_n++;         // 相当于是控制递增n  GOOD!!!

      m_sum += m_n;   // 累加的和处理

   }

   int A::getSum()

   {

     return m_sum;

   }

 

------ Main -------

int main()

{

    int n;

    std::cin >> n;    //首先你的告诉我n是什么是吧。不然我怎么做呢,呵呵

    *a new A[n];  // 构造一个A的数组(那么其实就会调用构造函数n次,其实这就是实现的本质! 

                       // 注意本质呗!!!!!!!!!!!

     std::cout<< A::getSum()<<std::endl;    //此时输出不就ok了是吧,O(∩_∩)O~

    delete []a;       //注意养成是否内存的好习惯,O(∩_∩)O~ 

    a = null;   

    return 0;

}

 

 

#2 下面我们看看第二种方法:使用递归处理:

   同样我们要声明两个类:

 

   classA;     // 先声明一下,因为我们需要一个全局的变量

   A *test[2];   //先用基类声明,当然子类也是可以调用的不是吗?O(∩_∩)O~

 

   class A

   {

      public:

             virtual intgetSum( int n  { return0;   // A中只有一个虚函数getSum() 

  };  

   class B: publicA       // B 继承 A

   {

      public:

            int getSum( int n )

            {

                return test[???]->getSum( n - 1 ) +n;// 这里的 [???]下面再说、、、、、、  

                                                      // 注意有C++的多态性可以知道,使用基类和子类

                                                      // 的函数是可以不一样的

               

   };

 

   那么我们在主函数中对于test[1]和test[0]是怎么处理的呢?

   test[0] =&A;    //是一个基类的对象,显然只能调用A的getSum

   test[1] =&b;   // 是一个子类的对象,显然只能可以调用B的getSum

  

   //其实有了上面的提示,我们知道现在想做的就是如何去协调使用test[0]和test[1],我们可以发现,其实

   //类A要做的就是退出不是吗?也就是说只有当 n == 0;的时候才会去调用,其他的情况就是全部是B的调用

   // 那么这里只有 0---> n;怎么转化到0和1呢??????

   //那么其实此处用到一个“投机的方法”;我们知道:只有n ~= 0( 和 !=  一样),那么 !n就是false,

   //然后再转化!n不就是转化为true了吗?其实我们知道C语言中的true和false宏定义处理的:

   // define true1,0也是一样的,所以这样不就ok了吗?呵呵,就这样test[0]和test[1]被我们构造出了!

 

   //那么下面要解决的就是[???]的问题了,其实已经说出来了不是吗?呵呵!就是 test[ !!n ] 就是可以!

  

   // 下面的调用:

   int n;

   cin >>n; 

   test[0] =&A;

   test[1] =&B;

   std::cout<< test[1]->getSum(n)<< std::endl;

   //这一块的知识主要是C++的多态性原理!!!!

 

>>>>>>>

      好了,其实还有一些方法,就不说了,准备午睡~~~ 困死我了,大中午的、、、、、、

 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:554868次
    • 积分:6456
    • 等级:
    • 排名:第3718名
    • 原创:182篇
    • 转载:36篇
    • 译文:0篇
    • 评论:82条
    博客专栏