C++另辟蹊径计算1到n的和

 更新时间:2023年02月13日 10:12:30   作者:Ggggggtm  
从1加到100,高斯的故事,我们学过。今天,我们写一个程序来试试。首先,用笨方法。一个数一个数的加,我们一般人就是这样干的吗。在计算机程序里面,怎么办呢?1我们把求和的功能写成一个可以针对不同的N运用的,C++里面叫函数

注:满足题目要求的解法有递归实现的第三种、公式实现、C++调用构造函数累加法三种方法、

一、题目简单描述

最近看到一道很有趣的算法题,更像脑筋急转弯吧,如下图:

我们可以看到,题目中给出的限制条件很多。先不管限制条件是什么,我们计算1到n的和无非就是用循环、递归、公式(等差数列)三类方法来计算。当然,循环实现很简单,这里就不再介绍。那么,不用循环怎么实现呢?我们先看用递归的方法。

二、递归实现

注意,我们先不管题目给出的限制条件,我们这里只限制不能用循环只用递归,看看都有哪些方法。

1、if…else…

用if…else…来判断递归的停止条件,相对也很容易,我们直接看代码。

int Sum_Solution(int n)
{
	if (n == 1)
		return 1;
	return n + Sum_Solution(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=Sum_Solution(n);
	printf("%d", ret);
	return 0;
}

2、三目运算符 ?:

在不用循环和if…else…的情况下还能怎么用呢?我们还可以想到三目运算符。其实三目运算符与if…else…思想大同小异,我们直接看代码。

int sum_solution(int n)
{
    return n==1?1:sum_solution(n-1)+n;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=Sum_Solution(n);
	printf("%d", ret);
	return 0;
}

3、逻辑与操作符 &&

难度加大,在不用循环和if…else…和三目运算符的情况下还能怎么用呢?好像不容易想出来其他方法了。其实当我们熟知逻辑与操作符(&&)的一个特性时,也就很用以做出来。当提到逻辑与操作符时,可能一时间想不到该怎么用。这时我们想想逻辑与操作符的性质。当两个条件同时为真时才为真,当第一个条件为假时,就不执行第二个条件了。这就是我们要抓住的点,来作为递归停止的条件。我们直接看代码。

int Sum_Solution(int n )
{
    int sum=n;
        sum&&(sum+=Sum_Solution(n-1));
    return sum;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=Sum_Solution(n);
	printf("%d", ret);
	return 0;
}

其实这种解法就满足本题目的要求了。

三、公式实现

公式实现的方法有很多,用乘除法、循环都很容易实现。但是题目中还要求了不能够用乘除法,那怎么用公式实现呢?在这里用了一个很巧妙的方法,就是定义一个二维数组,数组存储的数据类型大小为一个字节,通过计算数组的大小,最后用右移操作符(>>)相当于除于2来实现。我们结合代码一起理解一下。

int Sum_Solution(int n )
{
    char arr[n][n+1];
    return sizeof(arr)>>1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret=Sum_Solution(n);
	printf("%d", ret);
	return 0;
}

这种解法也满足题目的要求。

四、C++调用构造函数累加法

我们都知道C++在类和对象中,实例化对象都会调用构造函数。我们通过创建n个对象,同时设置成员变量为静态的,调用构造函数的累加法来实现。文字可能会有点不易理解,我们直接看代码。

class sum
{
public:
    sum()
    {
        ret+=i;
        ++i;
    }
    static int GetRet()
    {
        return ret;
    }
private:
    static int ret;
    static int i;
};
int sum::ret=0;
int sum::i=1;
class Solution {
public:
    int Sum_Solution(int n)
    {
        sum a[n];
        return sum::GetRet();
    }
};

这种方法也是满足题目的要求的。

我个人感觉这道题目挺有趣的,就整理出来跟大家分享一下。当然,可能还有其它的解法,欢迎大家讨论。

希望本篇文章对你有所帮助,感谢观看ovo!

到此这篇关于C++另辟蹊径计算1到n的和的文章就介绍到这了,更多相关C++计算1到n的和内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 使用CRC32检测内存映像完整性的实现步骤

    C++ 使用CRC32检测内存映像完整性的实现步骤

    当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬盘校验的基础上,增加内存校验,防止动态补丁的运用。
    2021-06-06
  • c++实现图像像素计算的示例详解

    c++实现图像像素计算的示例详解

    我们知道每张图像都能够用矩阵来表示,矩阵中每个元素的值表示了图像中每个像素值,像素值的大小就对应着图像的亮暗,本文主要来和大家介绍一下C++进行图像像素计算的相关知识,感兴趣的可以了解下
    2023-12-12
  • 哈夫曼的c语言实现代码

    哈夫曼的c语言实现代码

    着先通过 HuffmanTree() 函数构造哈夫曼树,然后在主函数 main()中自底向上开始(也就是从数组序号为零的结点开始)向上层层判断,若在父结点左侧,则置码为 0,若在右侧,则置码为 1。最后输出生成的编码
    2013-07-07
  • c语言实现简易版三子棋(附完整代码)

    c语言实现简易版三子棋(附完整代码)

    大家好,本篇文章主要讲的是c语言实现简易版三子棋(附完整代码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • QT应用启动失败排查方法小结

    QT应用启动失败排查方法小结

    启动QT应用经常会碰到应用启动失败,qt platform plugin无法启动,本文就来介绍一下QT应用启动失败排查方法小结,具有一定的参考价值,感兴趣的可以了解以下
    2023-09-09
  • C++ explicit关键字的使用详解

    C++ explicit关键字的使用详解

    这篇文章主要介绍了C++ explicit关键字的使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Windows下ncnn环境配置教程详解(VS2019)

    Windows下ncnn环境配置教程详解(VS2019)

    这篇文章主要介绍了Windows下ncnn环境配置(VS2019),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++ 面向对象程序设计--内存分区详解

    C++ 面向对象程序设计--内存分区详解

    这篇文章主要介绍了剖析C++的面向对象编程思想,C++的面向对象特性是其对C语言的重要拓展之处,需要的朋友可以参考下,希望能够给你带来帮助
    2021-08-08
  • 详解C语言中write函数

    详解C语言中write函数

    write函数,是一个C语言函数,功能为将数据写入已打开的文件内,这篇文章主要介绍了C语言中write函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • C++ xxx_cast实现转换代码实例解析

    C++ xxx_cast实现转换代码实例解析

    这篇文章主要介绍了C++xxx_cast转换代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论