题目:

求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(a?b:c)。

思路:

1、构造函数

在类中定义静态成员变量N和sum,在构造函数中++N,sum+=N;如此一来,创建n个该类型的实例,就会调用n次构造函数,对应的静态变量也就随着更新。

2、虚函数

使用递归时,既然不能再一个函数中判断是不是终止递归,那么不妨定义两个函数,一个函数充当递归函数,一个负责处理递归的结束条件;

需要解决的问题就是如何在两个函数中二选一,自然是通过bool变量。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。

3、函数指针

在纯C语言中,不能使用虚函数,此时可以使用函数指针来模拟。

4、模板类型

让编译器帮助完成类似于递归的计算。

代码:

1、构造函数

#include <iostream>

using namespace std;

class Sum{
public:
Sum(){ ++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 Sum::N=0;
unsigned int Sum::sum=0; unsigned int Sum_Solution(unsigned int n){
Sum::Reset();
Sum* a=new Sum[n];
delete[] a;
a=NULL; return Sum::getSum();
} int main()
{
cout << Sum_Solution(100) << endl;
return 0;
}

2、虚函数

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;
}
}; unsigned int Sum_Solution(unsigned int n){
A a;
B b;
array[0]=&a;
array[1]=&b; int sum=array[1]->Sum(n);
return sum;
} int main(){
int n=100;
cout << Sum_Solution(n) << endl;
}

3、函数指针

typedef unsigned int (*fun)(unsigned int);

unsigned int Solution_Terminator(unsigned int n){
return 0;
} unsigned int Sum_Solution(unsigned int n){
static fun f[2]={Solution_Terminator,Sum_Solution};
return n+f[!!n](n-1);
} int main(){
int n=100;
cout<< Sum_Solution(n)<< endl;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/7a0da8fc483247ff8800059e12d7caf1?rp=2

AC代码:

class Sum{
public:
Sum(){ ++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 Sum::N=0;
unsigned int Sum::sum=0; class Solution {
public:
int Sum_Solution(int n) {
Sum::reset();
Sum* a=new Sum[n];
delete[] a;
a=NULL; return Sum::getSum();
}
};

(剑指Offer)面试题46:求1+2+3+....+n的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  3. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  4. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  5. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  6. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

  7. C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解

    面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...

  8. 【剑指Offer面试题】 九度OJ1389:变态跳楼梯

    转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...

  9. 剑指Offer - 九度1506 - 求1+2+3+...+n

    剑指Offer - 九度1506 - 求1+2+3+...+n2013-11-29 19:22 题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switc ...

  10. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历

    二叉树的先序,中序,后序如何遍历,不在此多说了.直接看题目描述吧(题目摘自九度oj剑指offer面试题6): 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结 ...

随机推荐

  1. Bzoj2002/洛谷P3203 [HNOI2010]弹飞绵羊(分块)

    题面 Bzoj 洛谷 题解 大力分块,分块大小\(\sqrt n\),对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是 ...

  2. BZOJ4552 HEOI2016排序

    太棒了!思路很不错. 没想到HEOID1三道线段树. 这题我们可以二分答案,将小于他的在线段树中设成0,大于他的设成1然后模拟操作复杂度O(mlog^2n) By:大奕哥 #include<bi ...

  3. 我的OI生涯 第三章

    第三章 日子过得就像那些不眠的晚上,她嚼着口香糖对墙满谈着理想.——————赵雷<成都> NOIP过后我认识到了自己有多么菜,我换了座,到了靠窗户那排. 大王开始给我们介绍一些高端算法,那 ...

  4. asp.net调用存储过程2

    创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varchar(100)as select * from l ...

  5. [转]关于Java对中文排序的问题

          1 2 3 4 5 6 Comparator chinese_cmp = Collator.getInstance(Locale.CHINA);   String[] strs = new ...

  6. [转]基础总结篇之一:Activity生命周期

      子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思 ...

  7. pt-archive提速的实践经验

    最近遇到很多业务需求,需要进行数据导出工作,由于有格式要求,故之前一直使用mysqldump的方法. mysqldump -uuser -ppassword -S mysql.sock -t db t ...

  8. MyEclipse2015创建配置Web+Maven项目

    首先我的MyEclipse版本是2015 stable 2.0,在MyEclipse中创建Maven项目通常有两种常见的方式,它们分别是: New Maven Project  New Web Pro ...

  9. Apple Developer申请成功

    上周日白天,我去申请了Apple Developer.我先是在百度上浏览了一些经验教程,但是点进苹果开发者官网时却发现完全不是那么一回事.盖因它的页面经常在变,如同现在苹果在主推tvOS这个对中国用户 ...

  10. 使用WCF测试客户端 z

    http://blog.csdn.net/u013036274/article/details/50570989 [是什么] WCF测试客户端(WCF Test Client)是一个用来测试WCF服务 ...