博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(剑指Offer)面试题46:求1+2+3+....+n
阅读量:4677 次
发布时间:2019-06-09

本文共 2137 字,大约阅读时间需要 7 分钟。

题目:

求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 
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();    }};

 

转载于:https://www.cnblogs.com/AndyJee/p/4690591.html

你可能感兴趣的文章
2019 计蒜之道 初赛 第二场 B. 百度AI小课堂-上升子序列(简单) ( 实现)
查看>>
Python(2.7)-随机函数(random)
查看>>
loadrunner测试c/s架构的应用系统
查看>>
Mybatis学习笔记(一) 之框架原理
查看>>
Aptana 安装与配置
查看>>
ABSTRACT的方法是否可同时是STATIC,是否可同时是NATIVE,是否可同时是SYNCHRONIZED?
查看>>
【SPL标准库专题(10)】SPL Exceptions
查看>>
《Python从入门基础到实践》
查看>>
【读入优化】
查看>>
python-网络编程urllib模块
查看>>
0029 Java学习笔记-面向对象-枚举类
查看>>
CGRectGet *** 获取控件坐标的方法
查看>>
SQL的主键和外键约束
查看>>
Bookmarklet
查看>>
c++primer 第l六章编程练习答案
查看>>
上海秋季HCC小记
查看>>
Illustrator 上色
查看>>
ElasticSearch(七)容错机制
查看>>
truncate表恢复
查看>>
this关键字的使用
查看>>