题目:

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

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

(剑指Offer)面试题46:求1+2+3+....+n相关推荐

  1. 剑指offer——面试题46:求1+2+...+n

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

  2. 剑指Offer - 面试题64. 求1+2+…+n(递归)

    1. 题目 求 1+2+-+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6示例 ...

  3. 剑指offer 面试题64. 求1+2+…+n

    求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示例 2: ...

  4. 剑指offer面试题64. 求1+2+…+n(逻辑符短路)(递归)

    题目描述 求 1+2+-+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 思路 详见链接 代码 class Solution ...

  5. 剑指offer面试题之求第n个丑数

    1,问题: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 2,想法 ...

  6. 剑指Offer - 面试题46. 把数字翻译成字符串(DP)

    1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...

  7. 剑指offer——面试题9:求斐波那切数列的四种方法

    剑指offer--面试题9:求斐波那切数列的四种方法 另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333 总结下求 ...

  8. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  9. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  10. 【重点】剑指offer——面试题62:序列化二叉树

    剑指offer--面试题62:序列化二叉树 Solution1: 参考网址:https://www.nowcoder.com/profile/6475323/codeBookDetail?submis ...

最新文章

  1. MySQL重置root用户密码的方法【亲测可用】
  2. 推荐:Java性能优化系列集锦
  3. 利用系统错误日志监控磁盘健康状况
  4. 从mysql读取图片_如何从sql数据库内读取图片
  5. 【Python】IDE环境Pycharm运行虚拟环境Django
  6. Spark 基础 —— RDD(创建 RDD)的两种方式
  7. Cook‘n Recipe Organizer X3 Mac(食谱管理器)激活版
  8. java基于Springboot+vue的鲜花销售商城网站
  9. SQL Server2019 Express下载安装教程-——孟师傅
  10. uniapp开发微信公众号调用微信授权登录
  11. Android 获取无线蓝牙MAC信息代码
  12. window申请ios证书步骤
  13. cwRsync 文件备份
  14. python NLP中文近义词
  15. 3000计算机组装电脑,电脑组装教程,教您组装电脑配置清单
  16. oracle数据透明加密,oracle数据透明加密-TDE
  17. ubuntu18本地镜像源_Ubuntu 18.04 搭建私有软件镜像源(支持 Ubuntu 和 CentOS)
  18. 关于嵌入式EMW3162 Wifi模块的网络配置与测试
  19. windows java eclipse_从零开始学 Java - Windows 下安装 Eclipse
  20. html的tab页面切换刷新,切换tab页,页面局部刷新,地址栏路径修改

热门文章

  1. linux文件替换命令sed使用
  2. windows知识点2
  3. 解决freebsd下root默认不能用ssh连接
  4. XMPP的简介和基本概念
  5. “云”起风涌,邮件服务器助航企业云端升级
  6. 程序人生--一个程序员对学弟学妹建议
  7. python中文件打开的合法模式组合_以下选项中,不是Python文件打开的合法模式组合是:...
  8. python能写桌面程序吗_Python新手教程:40行python代码写一个桌面翻译器
  9. r语言导入ggplot2_【ggplot2】R语言:ggplot2包
  10. 网络-IP/子网掩码/端口