浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n
如侵犯您的版权,请联系:windeal12@qq.com
《剑指offer》上的一道原题,求1+2+……+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及条件判断语句(a?b:c)。
第一次看到这道题大约有一年的时间了,在霸笔网易的时候,当时我就晕了。。。心想这是神马东西,后来发现这是原题!!然后后悔自己没看过书了。。。
《剑指offer》上给出了不错的解法,但是这里有个解法更巧妙,虽然技术含量不高,但是可以参考,这就是《程序员面试笔试宝典》中所给出的答案。
解法一:利用宏定义求解
假设n=1000。相信看到答案的你们都会笑了。
- #include <stdio.h>
- #define L sum+=(++n);
- #define K L;L;L;L;L;L;L;L;L;L;
- #define J K;K;K;K;K;K;K;K;K;K;
- #define H J;J;J;J;J;J;J;J;J;J;
- int main()
- {
- int sum = 0;
- int n = 0;
- H;
- printf("%d\n", sum);
- return 0;
- }
怎么样!有木有很搞笑。。。。
解法二:利用构造函数
实际上就是利用类里面的静态成员变量,然后通过构造函数去调用。其实对于c++掌握熟练的人来说,也可以很轻松的明白。
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- class Temp
- {
- public:
- Temp(){++N; Sum += N;}
- static void Reset(){N=0; Sum=0;}
- static unsigned int GetSum(){return Sum;}
- private:
- static unsigned int N;
- static unsigned int Sum;
- };
- unsigned int Temp::N = 0;
- unsigned int Temp::Sum = 0;
- unsigned int Sum_Solution1(unsigned int n)
- {
- Temp::Reset();
- Temp *a = new Temp[n];
- delete []a;
- a = NULL;
- return Temp::GetSum();
- }
- int main()
- {
- printf("%d\n", Sum_Solution1(1000));
- return 0;
- }
解法三:利用虚函数求解
这也利用了多态的性质,特别巧妙。
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- class A;
- A* Array[2];
- class A
- {
- public:
- virtual unsigned int Sum(unsigned int n)
- {
- return 0;
- }
- };
- class B:public A
- {
- public:
- virtual unsigned int Sum(unsigned int n)
- {
- return Array[!!n]->Sum(n-1) + n;
- }
- };
- int Sum_Solutiion2(int n)
- {
- A a;
- B b;
- Array[0] = &a;
- Array[1] = &b;
- int value = Array[1]->Sum(n);
- return value;
- }
- int main()
- {
- printf("%d\n", Sum_Solutiion2(1000));
- return 0;
- }
这种思路基于虚函数来实现函数的选择,当n不为0的时候,一直调用的是B::Sum();当n等于0时,调用的就是函数A::Sum()。
解法四:利用函数指针求解
在纯C语言的编程环境中,我们不能使用虚函数,这时候函数指针就可以达到一样的效果了!
- #include <stdio.h>
- typedef unsigned int (*fun)(unsigned int);
- unsigned int Sum_Solutiion3_Teminator(unsigned int n)
- {
- return 0;
- }
- unsigned int Sum_Solutiion3(unsigned int n)
- {
- static fun f[2] = {Sum_Solutiion3_Teminator, Sum_Solutiion3};
- return n + f[!!n](n-1);
- }
- int main()
- {
- printf("%d\n", Sum_Solutiion3(1000));
- return 0;
- }
解法五:利用模板类型来求解
本质都是多态。可惜不是所有编译器都支持,VC++6.0就不支持。。
- #include <stdio.h>
- #include <iostream>
- template <unsigned int n>struct Sum_Solutiion4
- {
- enum Value{N = Sum_Solutiion4<N-1>::N + n};
- };
- template <> struct Sum_Solutiion4<1>
- {
- enum Value{N = 1};
- };
- int main()
- {
- printf("%d\n", Sum_Solutiion4<1000>::N);
- return 0;
- }
感觉这道题这些方法都能理解的话,说明c++水平已经不错了,我当时第一次看见都是云里雾里的!
浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n的更多相关文章
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- LeetCode剑指Offer刷题总结(一)
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...
- 剑指offer刷题
1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...
- 剑指offer刷题(Tree)
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
随机推荐
- H5 播放视频常见bug及解决方案
本文摘自:本文来自“小时光茶社(Tech Teahouse)”公众号 原文:https://mp.weixin.qq.com/s/MM5ZwCiWLAeHalsNYMImnw 1. 自动播放问题 通过 ...
- CSS Link(链接)
CSS Link(链接) 不同的链接可以有不同的样式. 一.链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等). 特别的链接,可以有不同的样式,这取决于他们是什么状态. 这四个链接状态 ...
- 20145312 《Java程序设计》第十周学习总结
20145312 <Java程序设计>第十周学习总结 学习笔记 Chapter 17反射与类加载器 17.1 运用反射 .class文档反应了类基本信息,因而从Class等API取得类信息 ...
- ubuntu 12.04及12.10无法安装 ia32-libs
administrator@ubuntu:~$ sudo apt-get install ia32-libs [sudo] password for administrator: 正在读取软件包列表 ...
- Java中private、protected、public和default的区别-001
public: 具有最大的访问权限,可以访问任何一个在classpath下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. protected: 主要的作用就是用来保护子 ...
- Pomelo热更新刷新handler和remote 以及 pomelo使用bearcat进行热更新
一. 开启 原生 pomelo 的hotreload支持 pomelo版本: 2.2.5 , 编辑脚本 app.js 加入如下代码 //全局配置 app.configure('production|d ...
- ifconfig设置ip时出现提示 ifconfig: SIOCSIFFLAGS: Address not available
一.笔者使用ifconfig观察网卡情况如下: root@jello:/# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:0 ...
- 用 SqlConnectionStringBuilder 来写连接字符串,向连接字符串添加设置
正常情况下写的连接字符串: connStr = "Data Source=127.0.0.1;DataBase=Hydor;UID=***;PWD=***;Pooling=true;Min ...
- HDU 3594 Cactus(仙人掌问题)
http://acm.hdu.edu.cn/showproblem.php?pid=3594 题意: 一个有向图,判断是否强连通和每条边只在一个环中. 思路: 仙人掌问题. 用Tarjan算法判断强连 ...
- POJ 1985 Cow Marathon(树的直径模板)
http://poj.org/problem?id=1985 题意:给出树,求最远距离. 题意: 树的直径. 树的直径是指树的最长简单路. 求法: 两遍BFS :先任选一个起点BFS找到最长路的终点, ...