每日一题:NowCower-JZ64.求1+2+3+...+n

每日一题系列(day 10)

前言:

   如果说代码有灵魂,那么它的灵魂一定是算法,因此,想要写出优美的程序,核心算法是必不可少的,少年,你渴望力量吗,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路,我们要做的,就是斩妖除魔,打怪升级!当然切记不可走火入魔,每日打怪,拾取经验,终能成圣!开启我们今天的斩妖之旅吧!✈️✈️


题目:

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

示例:

每日一题:NowCower-JZ64.求1+2+3+...+n_第1张图片

提示:

  • 数据范围: 0
  • 进阶: 空间复杂度 O(1) ,时间复杂度 O(n)

解法一:

  思路:

  虽然说这题看起来很简单,但是这题却限制了我们使用乘除运算,以及一些循环分支语句等,这样我们能利用的运算符少了很多,其实也就不那么容易了,但是我们C++里面有个很好的特性,利用构造函数来完成这题:

  1、我们可以利用C++的构造函数与静态成员变量来进行累加,定义一个Add类,在类内声明pubilc的静态成员sum和i,i表示加到的第几位数,sum表示累加总和。
   2、静态成员函数类内声明类外定义,i从1开始,sum从0开始累加,Add的构造函数每次调用都对i进行累加,累加到sum当中。
  3、还需要利用C语言中变长数组的概念,使用变长数组来创建n个对象,则会发生n次构造,则就会发生n次累加。
  4、创建n个对象之后,返回sum的值即可。

  代码实现:

class Add{
public:
    Add()
    {
        sum += i;
        ++i;
    }

    static int sum, i;
};

int Add::sum = 0;
int Add::i = 1;

class Solution {
public:
    int Sum_Solution(int n) {
        Add ans[n];
        return Add::sum;
    }
};

  对C++语法理解到位,这题就不难了。


解法二:

  思路:

  我们也可以不使用C++语法的形式来解决这题,仅仅使用变长数组的语法也完全可以做出来这题:
  前n项和公式:(首相+尾项)项数 / 2 == n(n+1)/2
  我们使用变长二维数组a[n][n+1],对其使用sizeof,则得到的结果再除以2就是前n项和,虽然题目里不能使用乘除,但是我们可以使用右移运算代替乘除法。

  代码实现:

class Solution {
public:
    int Sum_Solution(int n) {
        char a[n][n + 1];
        int ret = sizeof(a);
        return ret >> 1;
    }
};

  虽然这题限制了我们一些语法以及常用的运算符,但是我们依旧可以通过C/C++的语法来解决,其中构造函数和右移运算就是很好的解题方案。

你可能感兴趣的:(每日一题,C++,语法运用)