题目

要求不能使用乘除法, for, while, if else, switch, case 等关键字

思路

1. 循环已经命令禁止, 禁用 if, 意味着递归也不能使用. 但即便如此, 我们仍然要围绕循环或递归作文章

2. 利用构造函数求解

#include <iostream>
using namespace std; class Temp {
public:
Temp() {
++ N;
Sum += N;
cout << "constructing " << endl;
} 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() {
cout << Sum_Solution1(5) << endl;
return 0;
}

  

3. 利用虚函数求解

#include <iostream>
using namespace std;
class A; A *arr[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 arr[!!n]->Sum(n-1) + n;
}
}; int Sum_Solution2(int n) {
A a;
B b; arr[0] = &a, arr[1] = &b; int value = arr[1]->Sum(n); return value;
} int main() {
cout << Sum_Solution2(5) << endl;
return 0;
}

  

4. using function point. An alternative to virtual function but much more straightforward

#include <iostream>
using namespace std; typedef unsigned int (*fun) (unsigned int); unsigned int terminator(unsigned int n) {
return 0;
} unsigned int solution3(unsigned int n) {
static fun f[2] = {terminator, solution3};
return n + f[!!n](n-1);
}

  

总结

1. !!n 可以将整数转化为 0,1

2. heavy use of static to attach number to class or function

剑指 offer set 25 求 1+2+...+n的更多相关文章

  1. 剑指offer计划25(模拟中等)---java

    1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...

  2. 剑指offer六之求旋转数组的最小数字

    一.题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

  3. 剑指offer 面试25题

    面试25题:题目:合并两个排序的链表 题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路:递归,并需注意对空链表单独处理. 解题代码: # -* ...

  4. 剑指offer(25)复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  5. 【剑指Offer】25、复杂链表的复制

      题目描述:   输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节 ...

  6. 求1+2+3...+n 牛客网 剑指Offer

    求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...

  7. 【剑指Offer】剑指offer题目汇总

      本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...

  8. leetcode 338. Counting Bits,剑指offer二进制中1的个数

    leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种 ...

  9. 整数中1出现的次数 牛客网 剑指Offer

    整数中1出现的次数 牛客网 剑指Offer 题目描述 求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此 ...

随机推荐

  1. Linux命令-网络命令:wall

    wall hello word 向所有登录用户发送消息hello world root用户自己也会收到消息,wangyunpeng用户收到消息如下图:

  2. java 并发编程 list

     并发编程 Mark 以后看 http://cmsblogs.com/ http://www.jianshu.com/p/456b984c00b7

  3. java递归算法实现拼装树形JSON数据

    有时候页面需要使用jQuery easy ui中的combotree,需要给combotree提供一个JSON数据,使用如下方法(递归)实现(下面是dao层的实现层): /** * 根据表名和父id拼 ...

  4. vim中不同模式的帮助信息的查找

    vim的模式有多种,比如normal(普通模式),insert(插入模式),command(命令行模式),visual(可视化模式).相同的命令和快捷键在不同的模式下功能是不一样的,因此帮助信息也是分 ...

  5. Eclipse发布安卓APK包无图标的解决方法

    算是一个Bug,清空项目都不行. 解决方法是卸载掉项目,重新导入.

  6. atitit..sql update语法的词法分析,与语法ast构建

    atitit..sql update语法的词法分析,与语法ast构建 1. 要使用sql udpate语法的dsl ,需要写个解释器.. 1 2. 词法分析的实现 1 2.1. 扫描器的实现 SqlU ...

  7. Linux Kernel源码浏览

    https://www.kernel.org/http://lxr.linux.no/

  8. Message: 'geckodriver' executable needs to be in PATH. 解决方法

    问题描述: 执行如下代码 # coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.maxim ...

  9. poj 1611 The Suspects 并查集变形题目

    The Suspects   Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 20596   Accepted: 9998 D ...

  10. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...