zoukankan      html  css  js  c++  java
  • JZ-C-46

    剑指offer第四十六题:求1+2+3+...+n:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

      1 //============================================================================
      2 // Name        : JZ-C-46.cpp
      3 // Author      : Laughing_Lz
      4 // Version     :
      5 // Copyright   : All Right Reserved
      6 // Description : 求1+2+3+...+n:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
      7 //============================================================================
      8 
      9 #include <iostream>
     10 #include <stdio.h>
     11 using namespace std;
     12 // ====================方法一:利用构造函数求解====================
     13 class Temp {
     14 public:
     15     Temp() {
     16         ++N;
     17         Sum += N;
     18     }
     19 
     20     static void Reset() { //注意这里是静态方法
     21         N = 0;
     22         Sum = 0;
     23     }
     24     static unsigned int GetSum() { //注意这里是静态方法
     25         return Sum;
     26     }
     27 
     28 private:
     29     static unsigned int N; //注意这里是静态变量
     30     static unsigned int Sum; //注意这里是静态变量
     31 };
     32 
     33 unsigned int Temp::N = 0;
     34 unsigned int Temp::Sum = 0;
     35 
     36 unsigned int Sum_Solution1(unsigned int n) {
     37     Temp::Reset();
     38 
     39     Temp *a = new Temp[n]; //这里创建的是对象数组
     40     delete[] a;
     41     a = NULL;
     42 
     43     return Temp::GetSum();
     44 }
     45 
     46 // ====================方法二:利用虚函数求解====================
     47 /**
     48  * 一个函数充当递归函数的角色,另一个函数处理终止递归的情况,因此使用布尔变量,若n不为0,!!n为1;若n为0,!!n为0;
     49  */
     50 class A;
     51 A* Array[2];
     52 
     53 class A {
     54 public:
     55     virtual unsigned int Sum(unsigned int n) {
     56         return 0;
     57     }
     58 };
     59 
     60 class B: public A {
     61 public:
     62     virtual unsigned int Sum(unsigned int n) {
     63         return Array[!!n]->Sum(n - 1) + n;
     64     }
     65 };
     66 
     67 int Sum_Solution2(int n) {
     68     A a;
     69     B b;
     70     Array[0] = &a; //递归结束,调用的为父类Sum方法
     71     Array[1] = &b;
     72 
     73     int value = Array[1]->Sum(n);
     74 
     75     return value;
     76 }
     77 
     78 // ====================方法三:利用函数指针求解====================
     79 typedef unsigned int (*fun)(unsigned int); //函数指针定义
     80 
     81 unsigned int Solution3_Teminator(unsigned int n) {
     82     return 0;
     83 }
     84 
     85 unsigned int Sum_Solution3(unsigned int n) {
     86     static fun f[2] = { Solution3_Teminator, Sum_Solution3 };
     87     return n + f[!!n](n - 1);
     88 }
     89 
     90 // ====================方法四:利用模板类型求解====================
     91 template<unsigned int n> struct Sum_Solution4 {
     92     enum Value {//enum:枚举类型
     93         N = Sum_Solution4<n - 1>::N + n
     94     };
     95 };
     96 
     97 template<> struct Sum_Solution4<1> {
     98     enum Value {
     99         N = 1
    100     };
    101 };
    102 
    103 template<> struct Sum_Solution4<0> {
    104     enum Value {
    105         N = 0
    106     };
    107 };
    108 
    109 // ====================测试代码====================
    110 void Test(int n, int expected) {
    111     printf("Test for %d begins:
    ", n);
    112 
    113     if (Sum_Solution1(n) == expected)
    114         printf("Solution1 passed.
    ");
    115     else
    116         printf("Solution1 failed.
    ");
    117 
    118     if (Sum_Solution2(n) == expected)
    119         printf("Solution2 passed.
    ");
    120     else
    121         printf("Solution2 failed.
    ");
    122 
    123     if (Sum_Solution3(n) == expected)
    124         printf("Solution3 passed.
    ");
    125     else
    126         printf("Solution3 failed.
    ");
    127 }
    128 
    129 void Test1() {
    130     const unsigned int number = 1;
    131     int expected = 1;
    132     Test(number, expected);
    133     if (Sum_Solution4<number>::N == expected)
    134         printf("Solution4 passed.
    ");
    135     else
    136         printf("Solution4 failed.
    ");
    137 }
    138 
    139 void Test2() {
    140     const unsigned int number = 5;
    141     int expected = 15;
    142     Test(number, expected);
    143     if (Sum_Solution4<number>::N == expected)
    144         printf("Solution4 passed.
    ");
    145     else
    146         printf("Solution4 failed.
    ");
    147 }
    148 
    149 void Test3() {
    150     const unsigned int number = 10;
    151     int expected = 55;
    152     Test(number, expected);
    153     if (Sum_Solution4<number>::N == expected)
    154         printf("Solution4 passed.
    ");
    155     else
    156         printf("Solution4 failed.
    ");
    157 }
    158 
    159 void Test4() {
    160     const unsigned int number = 0;
    161     int expected = 0;
    162     Test(number, expected);
    163     if (Sum_Solution4<number>::N == expected)
    164         printf("Solution4 passed.
    ");
    165     else
    166         printf("Solution4 failed.
    ");
    167 }
    168 
    169 int main(int argc, char** argvb) {
    170     Test1();
    171     Test2();
    172     Test3();
    173     Test4();
    174 
    175     return 0;
    176 }
  • 相关阅读:
    冬至——汤圆
    偷偷的高兴!
    sql 70229 考试样题(2)
    SQL Server开发人员应聘常被问的问题妙解汇总
    GOOLE Picasa Web License
    辞旧迎新!
    VC98\mfc\lib' specified in 'LIB environment variable' 系统找不到指定路径
    ASP 入门
    OpenCV类型转换
    坐标旋转变换公式的推导
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5624799.html
Copyright © 2011-2022 走看看