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

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

每日一题系列(day 10)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

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


题目:

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

示例:

提示:

  • 数据范围: 0<n≤200
  • 进阶: 空间复杂度 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语言 C++
【九章斩题录】从尾到头打印链表(JZ6)
【九章斩题录】从尾到头打印链表(JZ6)
54 0
|
6月前
USACO1.3 修理牛棚
USACO1.3 修理牛棚
|
C语言 C++ Python
【九章斩题录】C/C++:替换空格(JZ5)
【九章斩题录】C/C++:替换空格(JZ5)
76 0
|
算法 C语言 C++
【九章斩题录】C/C++:二维数组中的查找(JZ4)
【九章斩题录】C/C++:二维数组中的查找(JZ4)
94 0
|
机器学习/深度学习 算法 C++
剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)
剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)
|
算法
[USACO 2007 Jan S]Protecting the Flowers
[USACO 2007 Jan S]Protecting the Flowers
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P3009-[USACO11JAN]Profits S(DP-最大子段和)
洛谷P3009-[USACO11JAN]Profits S(DP-最大子段和)
洛谷P3009-[USACO11JAN]Profits S(DP-最大子段和)