// 面试题64:求1+2+…+n
// 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case
// 等关键字及条件判断语句(A?B:C)。 #include <iostream> // ====================方法一====================
//使用构造函数
class Temp
{
public:
Temp() { ++N; Sum += N; } static void Reset() { N = ; Sum = ; }
static unsigned int GetSum() { return Sum; } private:
static unsigned int N;
static unsigned int Sum;//静态成员,所有实例共享
}; unsigned int Temp::N = ;
unsigned int Temp::Sum = ; unsigned int Sum_Solution1(unsigned int n)
{
Temp::Reset(); Temp *a = new Temp[n];//建立n次,实现sum加和
delete[]a;
a = NULL; return Temp::GetSum();
} // ====================方法二====================
//使用虚函数
class A;
A* Array[]; class A
{
public:
virtual unsigned int Sum(unsigned int n)
{
return ;
}
}; class B : public A
{
public:
virtual unsigned int Sum(unsigned int n)
{
return Array[!!n]->Sum(n - ) + n;
}
}; int Sum_Solution2(int n)
{
A a;
B b;
Array[] = &a;
Array[] = &b; int value = Array[]->Sum(n);//当n大于0时,总是执行B类中的sum,直到n=0,!!n=0,然后变成了Array[0]->Sum(n),即A类,注意Array设成全局变量 return value;
} // ====================方法三====================
//使用函数指针
typedef unsigned int(*fun)(unsigned int); unsigned int Solution3_Teminator(unsigned int n)
{
return ;
} unsigned int Sum_Solution3(unsigned int n)
{
static fun f[] = { Solution3_Teminator, Sum_Solution3 };//静态成员,第一次调用时候建立
return n + f[!!n](n - );
} // ====================方法四====================
//使用模版类型
template <unsigned int n> struct Sum_Solution4
{
enum Value { N = Sum_Solution4<n - >::N + n };//Sum_Solution4<number>::N就是我们要的值
}; template <> struct Sum_Solution4<>
{
enum Value { N = };
}; template <> struct Sum_Solution4<>
{
enum Value { N = };
}; // ====================测试代码====================
void Test(int n, int expected)
{
printf("Test for %d begins:\n", n); if (Sum_Solution1(n) == expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n"); if (Sum_Solution2(n) == expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n"); if (Sum_Solution3(n) == expected)
printf("Solution3 passed.\n");
else
printf("Solution3 failed.\n");
} void Test1()
{
const unsigned int number = ;
int expected = ;
Test(number, expected);
if (Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
} void Test2()
{
const unsigned int number = ;
int expected = ;
Test(number, expected);
if (Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
} void Test3()
{
const unsigned int number = ;
int expected = ;
Test(number, expected);
if (Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
} void Test4()
{
const unsigned int number = ;
int expected = ;
Test(number, expected);
if (Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
system("pause");
return ;
}

《剑指offer》第六十四题(求1+2+…+n)的更多相关文章

  1. 《剑指offer》第十四题(剪绳子)

    // 面试题:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1]* ...

  2. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  3. 剑指Offer(三十四):第一个只出现一次的字符

    剑指Offer(三十四):第一个只出现一次的字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  4. 剑指Offer(二十四):二叉树中和为某一值的路径

    剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  5. 《剑指offer》第十九题(正则表达式匹配)

    // 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...

  6. 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...

  7. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...

  8. 《剑指offer》第二十五题(合并两个排序的链表)

    // 面试题25:合并两个排序的链表 // 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 // 照递增排序的.例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链 ...

  9. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...

  10. 《剑指offer》第十八题(删除链表中重复的结点)

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

随机推荐

  1. Windbg解决系统蓝屏

    win10企业版连续两天遭遇系统蓝屏, 今天就各种检查,准备好好地研究一下这个问题,以下是整个过程: 首先,找到系统蓝屏时的错误日志: [计算机] --> [管理] --> [系统工具] ...

  2. Vue小案例 之 商品管理------删除商品与提示

    实现删除商品功能 根据索引来进行删除商品: 实现删除商品的HTML: <!--显示表格--> <div class="table-warp"> <di ...

  3. 02: http

    1.1 http简介 1.什么是http 1. HTTP是一个客户端和服务器端请求和应答的标准(TCP) 2. 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 2.http报文格式 ...

  4. es修改数据类型

    环境:es版本:6.5.0 es创建好了mapping后是不允许修改字段类型的,要是我们想修改字段类型怎么办呢,我们可以采用reindex的方法实现,就是创建一个新的mapping,里面的字段类型按照 ...

  5. linux删除指定创建时间文件(文件夹)脚本

    环境 解法 一个for循环 remove.sh #/bin/bash fileName=`ls --full-time | grep '2016' | awk {'print$9'}` for fil ...

  6. Kali linux 2018安装后全屏乱码解决

    安装的时候选择了中文, 后来安装成功后成了全部乱码的. 原因是,系统没有中文字体显示安装包, 下载一个 sudo apt-get install ttf-wqy-zenhei 重启解决!

  7. centOS 安装 Webmin

    http://www.webmin.com/rpm.html 修改配置文件在这里: /etc/webmin/miniserv.conf

  8. 20145208 蔡野 《网络对抗》Exp8 Web基础

    20145208 蔡野 <网络对抗>Exp8 Web基础 本实践的具体要求有: (1).Web前端HTML(1分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POS ...

  9. iOS开发 -------- 九宫格坐标计算

    一 要求 完成下面的布局 二 分析 寻找规律,每一个UIView的x坐标和y坐标 三 实现思路 (1) 明确每一块用得是什么View; (2) 明确每个View之间的父子关系,每个视图都只有一个父视图 ...

  10. 分块读取Blob字段数据(MSSQL)

    MSSQL中提供了一个功能,能够分块读取Blob字段中的数据,写了一个存储过程代码如下: CREATE PROCEDURE PRO_GET_FILE_DATA     @PKG_ID INT,     ...