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

原创 2012年03月21日 06:53:49

    对于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++的多态性原理!!!!

 

>>>>>>>

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

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

745N V1

  • 2015-07-06 13:12
  • 1.06MB
  • 下载

1+2+...+N求和汇编

实验3-1 赋值操作符

实验目的: 1.理解赋值操作符的作用 2.掌握如何判断一个C表达式是否合法。 3.体会每个C表达式都有一个值的含义。 实验步骤: 1.赋值操作符有何作用? 1.1分析程序并说明赋值操作符的...
  • stunt
  • stunt
  • 2012-02-04 14:39
  • 327

ldd3 sbull编译遇到的问题 解决(部分)方法

源自于:http://www.vsyo.com/a/t/79a054b715b8bb10 开始第一次make:结果如下: root@ubuntu:/home/shevarey/ssdd/s...

《精通Hadoop》:第 1 章 Hadoop 2.X

第 1 章 Hadoop 2.X “没有什么是不能通过搜索引擎或互联网找到的。” ——埃里克·施密特,谷歌执行主席 在大规模、高并行和分布式计算处理这个行业中,Hadoop实...

实验2-1 多种进制形式的整型数据的输入输出

特别声明: 从本章开始,需要实验者根据实验目的及相关知识自己总结出每次实验的重难点。如果对知识点比较熟悉,则可在实验之前总结出实验的重难点。也可在做完实验之后总结出本次实验的重难点。实验的重难点可作...
  • stunt
  • stunt
  • 2012-01-14 16:25
  • 1482

经典分享 C++内存管理详解 1(共2部分)

C++内存管理。程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地...

Part1 デジタル家電編(1)――事業の核はキーデバイス開発,3つの業務プロセスをITで支援

Part1 デジタル家電編(1)――事業の核はキーデバイス開発,3つの業務プロセスをITで支援 薄型テレビ,DVDレコーダー,デジタルカメラは「新・三種の神器」と言われる。これらのデジタル家電は...

3.2.2 工具栏上动态创建控件combobox

p120,单文档 // MainFrm.h : interface of the CMainFrame class // ////////////////////////////////////...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)