关闭

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

903人阅读 评论(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网站的观点或立场

阶乘计算(蓝桥杯)

基础练习 阶乘计算 基础练习 阶乘计算 时间限制:1.0s 内存限制:512.0MB 问题描述   输入一个正整数n,输出n!的值。   其中n!=1*2*3*…*n。 算法描述 ...
  • chensanwa
  • chensanwa
  • 2018-01-09 15:22
  • 42

【1998普及】高精度计算

【1998普及】高精度计算Description 用高精度计算出S=1!+2!+3!+...n!)(n<=50)其中"!"表示阶乘,例如:5!=5*4*3*2*1 Input 输入正整数N...
  • codingdd
  • codingdd
  • 2017-03-10 09:13
  • 117

整数划分如,对于正整数n=6,可以分划为:6 5+1

整数划分 如,对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+...
  • chzayi
  • chzayi
  • 2015-03-28 15:21
  • 1643

Openjudge NOI题库1.13编程基础之综合应用12:分数求和

12:分数求和 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为...
  • EnemyGodlike
  • EnemyGodlike
  • 2017-01-20 15:33
  • 931

51nod 1225 余数之和(根号n枚举)

F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n)。其中%表示Mod,也就是余数。  例如F(6) = 6 % 1 + 6 % 2 + 6 % 3...
  • Miracle_ma
  • Miracle_ma
  • 2016-05-16 21:13
  • 771

51nod 1284:2 3 5 7的倍数 容斥原理

1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出一个数N,求1...
  • u010885899
  • u010885899
  • 2015-08-27 09:59
  • 1277

来往这里看!高精度处理阶乘和~

用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入正整数N,输出计算结果S。 这篇文章是用高精度来处理的,大家...
  • qq_37555704
  • qq_37555704
  • 2017-02-27 13:30
  • 523

杭电OJ——2046 骨牌铺方格(简单的推断题)

骨牌铺方格 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放...
  • lishuhuakai
  • lishuhuakai
  • 2013-01-22 19:34
  • 10445

华为机试—亮着电灯的盏数(求完全平方数的个数)

题目:亮着电灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 有n个学生从长廊...
  • wdkirchhoff
  • wdkirchhoff
  • 2014-12-25 09:14
  • 2990

linux中shell变量$#,$@,$0,$1,$2的含义解释

linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID...
  • beginning1126
  • beginning1126
  • 2013-03-04 15:38
  • 6093
    个人资料
    • 访问:617325次
    • 积分:7001
    • 等级:
    • 排名:第3819名
    • 原创:182篇
    • 转载:36篇
    • 译文:0篇
    • 评论:84条
    博客专栏