转载自:浅谈《剑指offer》原题:求1+2+……+n

如侵犯您的版权,请联系:windeal12@qq.com

《剑指offer》上的一道原题,求1+2+……+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及条件判断语句(a?b:c)。

第一次看到这道题大约有一年的时间了,在霸笔网易的时候,当时我就晕了。。。心想这是神马东西,后来发现这是原题!!然后后悔自己没看过书了。。。

《剑指offer》上给出了不错的解法,但是这里有个解法更巧妙,虽然技术含量不高,但是可以参考,这就是《程序员面试笔试宝典》中所给出的答案。

解法一:利用宏定义求解

假设n=1000。相信看到答案的你们都会笑了。

  1. #include <stdio.h>
  2. #define L   sum+=(++n);
  3. #define K   L;L;L;L;L;L;L;L;L;L;
  4. #define J   K;K;K;K;K;K;K;K;K;K;
  5. #define H   J;J;J;J;J;J;J;J;J;J;
  6. int main()
  7. {
  8. int sum = 0;
  9. int n = 0;
  10. H;
  11. printf("%d\n", sum);
  12. return 0;
  13. }

怎么样!有木有很搞笑。。。。

解法二:利用构造函数

实际上就是利用类里面的静态成员变量,然后通过构造函数去调用。其实对于c++掌握熟练的人来说,也可以很轻松的明白。

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. class Temp
  5. {
  6. public:
  7. Temp(){++N; Sum += N;}
  8. static void Reset(){N=0; Sum=0;}
  9. static unsigned int GetSum(){return Sum;}
  10. private:
  11. static unsigned int N;
  12. static unsigned int Sum;
  13. };
  14. unsigned int Temp::N = 0;
  15. unsigned int Temp::Sum = 0;
  16. unsigned int Sum_Solution1(unsigned int n)
  17. {
  18. Temp::Reset();
  19. Temp *a = new Temp[n];
  20. delete []a;
  21. a = NULL;
  22. return Temp::GetSum();
  23. }
  24. int main()
  25. {
  26. printf("%d\n", Sum_Solution1(1000));
  27. return 0;
  28. }

解法三:利用虚函数求解

这也利用了多态的性质,特别巧妙。

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. class A;
  5. A* Array[2];
  6. class A
  7. {
  8. public:
  9. virtual unsigned int Sum(unsigned int n)
  10. {
  11. return 0;
  12. }
  13. };
  14. class B:public A
  15. {
  16. public:
  17. virtual unsigned int Sum(unsigned int n)
  18. {
  19. return Array[!!n]->Sum(n-1) + n;
  20. }
  21. };
  22. int Sum_Solutiion2(int n)
  23. {
  24. A a;
  25. B b;
  26. Array[0] = &a;
  27. Array[1] = &b;
  28. int value = Array[1]->Sum(n);
  29. return value;
  30. }
  31. int main()
  32. {
  33. printf("%d\n", Sum_Solutiion2(1000));
  34. return 0;
  35. }

这种思路基于虚函数来实现函数的选择,当n不为0的时候,一直调用的是B::Sum();当n等于0时,调用的就是函数A::Sum()。

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

在纯C语言的编程环境中,我们不能使用虚函数,这时候函数指针就可以达到一样的效果了!

  1. #include <stdio.h>
  2. typedef unsigned int (*fun)(unsigned int);
  3. unsigned int Sum_Solutiion3_Teminator(unsigned int n)
  4. {
  5. return 0;
  6. }
  7. unsigned int Sum_Solutiion3(unsigned int n)
  8. {
  9. static fun f[2] = {Sum_Solutiion3_Teminator, Sum_Solutiion3};
  10. return n + f[!!n](n-1);
  11. }
  12. int main()
  13. {
  14. printf("%d\n", Sum_Solutiion3(1000));
  15. return 0;
  16. }

解法五:利用模板类型来求解

本质都是多态。可惜不是所有编译器都支持,VC++6.0就不支持。。

  1. #include <stdio.h>
  2. #include <iostream>
  3. template <unsigned int n>struct Sum_Solutiion4
  4. {
  5. enum Value{N = Sum_Solutiion4<N-1>::N + n};
  6. };
  7. template <> struct Sum_Solutiion4<1>
  8. {
  9. enum Value{N = 1};
  10. };
  11. int main()
  12. {
  13. printf("%d\n", Sum_Solutiion4<1000>::N);
  14. return 0;
  15. }

感觉这道题这些方法都能理解的话,说明c++水平已经不错了,我当时第一次看见都是云里雾里的!

浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n的更多相关文章

  1. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  2. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  3. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  4. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  5. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  6. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

  7. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  8. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  9. 剑指offer刷题(Tree)

    开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...

  10. 剑指offer编程题Java实现——替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...

随机推荐

  1. 【Error】安装程序无法打开注册表项 UNKNOWN\Components\...

    在安装程序的时候出现错误信息: 解决方法: 依次点击开始,所有程序,附件,右键单击命令提示符,选择以管理员身份运行.运行secedit /configure /cfg %windir%\inf\def ...

  2. Web安全学习笔记之Kali配置国内软件更新源

    0x0 前言 Kali安装完成后,默认是国外官方的更新源,更新速度4kb/s太酸爽了... 0x1 把更新源设置为国内阿里云或者中科大的镜像源 命令行:leafpad /etc/apt/sources ...

  3. STC12C系列单片机PWM脉宽调制

    最近给别人做了一个小东西,MCU选的是STC12C5A60S2 ,需要用到PWM控制功能. 在网上找了一下,发现解释的不尽人意,无奈之下自己琢磨数据手册弄明白了. 首先,STC12C5A60S2内置有 ...

  4. Mysql 整理错误

    Mysql 启动报PID错误 Starting MySQL..ERROR! The server quit without updating PID file (/usr/local/mysql/da ...

  5. mouseleave mouseout时候悬浮框不应该消失的时候消失了 css 解决办法

    要实现的效果和代码思路 简单来说就是 用一个div包着喇叭和悬浮框 悬浮事件写在这个div上 鼠标悬浮到div上的时候 悬浮框出现 最终要做成鼠标从小喇叭移动到下面的框上的时候 下面框是不会消失的. ...

  6. Nginx基础笔记

    压力测试工具:ab ab -n 请求数 -c 并发数 请求url Nginx: Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务. 特点 ...

  7. 20145321 《Java程序设计》课程总结

    20145321 <Java程序设计>课程总结 读书笔记链接汇总 第一周读书笔记 第二周读书笔记 第三周读书笔记 第四周读书笔记 第五周读书笔记 第六周读书笔记 第七周读书笔记 第八周读书 ...

  8. zabbix分布式监控系统安装配置

    zabbix简介: zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵 ...

  9. Job流程:决定map个数的因素

    此文紧接Job流程:提交MR-Job过程.上一篇分析可以看出,MR-Job提交过程的核心代码在于 JobSubmitter 类的 submitJobInternal()方法.本文就由此方法的这一句代码 ...

  10. random模块中最常用的几个函数

    转自:http://www.cnblogs.com/yd1227/archive/2011/03/18/1988015.html 随机整数:>>> import random> ...