zoukankan      html  css  js  c++  java
  • 面试题46:求1+2+...+n

    题目:求1+2+...+n,要求不能使用乘除法、for、while、if、else、swithc、case等关键字及条件判断语句(A?B:C)。

    解法一:利用构造函数求解

     1 class Temp
     2 {
     3     public:
     4         Temp()
     5         {
     6             ++N;
     7             Sum+=N;
     8         }
     9         static void Reset()
    10         {
    11             N = 0;
    12             Sum = 0;
    13         }
    14         static unsigned int GetSum()
    15         {
    16             return sum;
    17         }
    18     private:
    19         static unsigned int N;
    20         static unsigned int Sum;
    21 }
    22 unsigned int Temp::N = 0;
    23 unsigned int Temp::Sum = 0;
    24 
    25 unsiged int Sum_Solution1(unsigned int n)
    26 {
    27     Temp::Reset();
    28     Temp* a = new Temp[n];
    29     delete [] a;
    30     a = NULL;
    31     return Temp::GetSum();
    32 }

     解法二:利用虚函数求解

    可以定义两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然地想到布尔变量。现在的问题是如何把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。

     1 class A;
     2 A* Array[2];
     3 
     4 class A
     5 {
     6     public:
     7         virtual unsigned int Sum(unsigned int n)
     8         {
     9             return 0;
    10         }
    11 };
    12 
    13 class B: publice A
    14 {
    15     public:
    16         virtual unsigned int Sum(unsigned int n)
    17         {
    18             return Array[!!n]->Sum(n-1)+n;
    19         }
    20 };
    21 
    22 int Sum_Solution2(int n)
    23 {
    24     A a;
    25     B b;
    26     Array[0] = &a;
    27     Array[1] = &b;
    28     return Array[1]->Sum(n);
    29 }

    解法三:利用函数指针求解

    在纯C语言的编程环境中,我们不能使用虚函数,此时可以用函数指针来模拟。

     1 typedef unsigned int (*fun)(unsigned int);
     2 unsigned int Solution3_Teminator(unsigned int n)
     3 {
     4     return 0;
     5 }
     6 
     7 unsigned int Sum_Solution3(unsigned int n)
     8 {
     9     static fun f[2] = {Solution3_Teminator, Sum_Solution3};
    10     return n+f[!!n](n-1);
    11 }

    解法四:利用模板类型求解

    见《剑指Offer》。

  • 相关阅读:
    在ubuntu 12.04 x64下编译hadoop2.4
    Learn ZYNQ (9)
    Learn ZYNQ (8)
    Jquery 中 ajaxSubmit使用讲解(转)
    JSON.parse()和JSON.stringify()的区别
    $('div','li'),$('div , li'),$('div li')的区别
    用正则表达式来去除字符的前后空格
    git add 命令添加所有改动内容
    js基础知识
    Web开发学习笔记
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4627394.html
Copyright © 2011-2022 走看看