46 - 不使用 乘除、循环和判断 语句实现 1+...+n

题目:

求 1 + 2 + … + n. 要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)



要实现 1 + 2 + …+ n 不管是循环实现还是递归实现都必须有终止条件。

思路一

循环是让相同的代码执行 n 遍。

使用构造函数和静态成员变量实现。构造 n 个类,构造函数会执行 n 次,用静态变量实现 i 递增, sum 求和。

#include <iostream>
using namespace std;

class Solution {
public:
    // 注意,构造函数不能是静态的
    Solution() {
        ++num;
        sum += num;
    };
    static unsigned int GetSum() {
        return sum;
    }
    static void Reset(){
        num = 0, sum = 0;
    };
private:
    static unsigned int num;
    static unsigned int sum;
};
// 静态成员变量使用前,必须显式初始化
unsigned int Solution::num = 0;
unsigned int Solution::sum = 0;
int main() {
    const int n = 10;
    Solution::Reset();
    Solution* sol = new Solution[n];
    cout << sol[n].GetSum() << endl;
    delete []sol;
}

思路二

基于递归实现,当 i == 0 时要终止递归,那么能否,当一个数字不等于 0 时调用递归函数,而它等于 0 时自动调用另一个终止函数呢?

使用派生类和基类间虚函数实现。

基类的指针可以指向派生类,虚函数表中存储的是对象所属类的虚函数。

!!n 将非0值转化为 1, 0 转化为 0

#include <iostream>
using namespace std;

class A;
A *array[2]; // 不能用 A array[2] 因为 A 不完整,只能定义指针
class A {
public:
    // A的虚函数,实现终止
    virtual unsigned int Sum(unsigned int n) {
        return 0;
    }
};

class B: public A {
public:
    //B的虚函数,实现递归
    virtual unsigned int Sum(unsigned int n) {
        return array[!!n]->Sum(n-1) + n; // !!n 将非0值转化为 1, 0 转化为 0
    }
};

int main() {
    A a;
    B b;
    array[0] = &a; // array[0]指向的虚函数表中是:A的虚函数,实现终止
    array[1] = &b; // array[1]指向的虚函数表中是:B的虚函数,实现递归
    cout << array[1]->Sum(10) << endl;
}

参考《剑指offer》 p234

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 18:42:06

46 - 不使用 乘除、循环和判断 语句实现 1+...+n的相关文章

【C语言】不使用循环和判断语句,求出1-100之间所有数的和

//不使用循环和判断语句,求出1-100之间所有数的和 #include <stdio.h> int fun(int n, int *sum) { *sum = *sum + n; (n--) && (fun(n, sum)); return n; } int main() { int n = 100; int sum = 0; fun(n, &sum); printf("%d\n", sum); return 0; } <img src=&q

Swift流程控制之循环语句和判断语句详解

Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代码的另一个点上. 除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历arrays, dictionaries, ranges, strings等其他序列类型. Swift的switch语句也比C语言的要强大很多. Swift中swi

python基础:循环语句和判断语句

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. python语句块和缩进 缩进是Python语法的一部分:在python语句中,空格是用来区分块的,每一块的语句,缩进量(空格)应该是相同的 Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字: 增加缩进表示语句块的开始,而减少缩进则表示语句块的退出. 在Python中,冒号(:)用来标识语

VB的判断语句和循环语句

判断语句 •If语句 if语句共有4种写法: 第一种语法: If 条件判断语句 then 程序代码 第二种语法:If 条件判断语句 then 程序代码 else 程式代码 第三种语法: If 条件判断语句 then 程式代码 Else 程式代码 End if 第四种语法 If 条件判断语句 then Elseif 条件判断语句 then 程式代码 Elseif 条件判断语句 then 程式代码 …… Else 程式代码 End if •Select语句 Select语句的语法是: Select

bash循环,判断语句总结

bash基本的逻辑判断 for:遍历说有列表的元素 while: 只要判断体为真就一直循环 until: 只要判断体为假就一直循环 if:条件判断语句 在详述这四个命令前,先看下一些基本知识 bash的算数运算 [[email protected] ~]# a=5 [[email protected] ~]# b=7 [[email protected] ~]# echo $a+$b 5+7 上面例子说明a,b是字符不会根据符号自动做运算. 如果要做运算需要$[]括起来, 但是结果是整数 [[e

C#语言中常用的判断语句和循环语句

C#语言中,我们常用的判断语句和循环语句都有哪些呢? 1.if判断 代码格式:if(条件1){ 代码1 }else if(条件2){ 代码2               }else{ 代码N} 意义为:如果条件1成立,则执行代码1,否则判断条件2是否成立,如果成立,则执行代码2,如果以上条件都不成立,执行代码N. 注意:else部分可以省略,省略之后,意义变为"如果以上条件不成立,判断结束":else if 部分可以重复任意次数(一个不写,意义变为如果条件1成立执行代码1,否则执行代码

if判断语句和循环语句

if判断语句 描述 :if条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 语法 : if  表达式  : 执行的代码 else: 执行的代码 多分支if语句: 语法: if  表达式  :  #满足之后执行下面的代码 执行的代码 elif  表达式: #满足之后执行下面的代码  可以有多个 执行的代码 for循环: 描述:for in结构,迭代器 语法:for  变量  in 序列: 执行的代码 example: for循环的嵌套: example whil

shell脚本判断语句和循环语句

if判断语句 exit跳出判读语句 不加exit的结果 read -n(不换行) 判断是否输入的是数字 read age[[ $age =~ ^[0-9]+$ ]]if [ $? -ne 0 ]; then echo "你输入的不是一个数字" exit 1fi case判断语句 #!/bin/bashcat <<EOF########################################### 欢迎学习shell编程 #######################

9、python判断语句与循环语句

前言:本文主要介绍python判断语句与循环语句,包括if语句.while循环.for循环.range函数. 一.if语句  关键字:if.elif.else,写法如下: # if if 条件: # (条件可以是任意表达式) # 条件成立,执行此处代码,条件不成立,跳过此处代码,继续往下执行其他diamante # if -- else if 条件: # 条件成立,执行此处代码,后面的else语句不会执行 else: # 条件不成立,执行此处代码 # if -- elif -- else if