1+2+……+n的特殊求法

本文介绍了一种特殊的编程挑战,即在限制使用多种常见关键字的情况下计算从1累加到n的和。文中提供了五种不同的解决方案,包括巧妙运用逻辑与运算符、构造函数与静态成员变量、虚函数与函数指针、异常处理机制以及模板特化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人博客传送门
参考来源

题目:

求1+2+3+…+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句。

自己思考想到了一种方法,递归的思路,但是判断终止的条件不是if,利用了&&的性质,当前操作数为假的时候,不再进行后操作数的运算。然后在网上查阅,得到了其他的做法。

1、利用&&操作符,|| 也一样的做法。

思路:当result = 0 的时候,&&不再判断右操作数,递归停止

int sum( int n ){
    int result = n;
    result && (result += sum(n-1));
    return result;
}

int main(){
    cout << sum(100) << endl;
    return 0;
}
2、利用构造函数以及静态成员变量

思路:构造N次对象,每次对静态变量sum++,对n赋值。利用静态变量对所有同类对象有效的特点。

class tmp{
public:
    //构造
    tmp( ){
        ++n;
        sum += n;
    }
    //初始化
    void static init(){
        n = 0;
        sum = 0;
    }
    //获得sum
    int static getsum(){
        return sum;
    }
private:
    static int n;
    static int sum;
};

int tmp::n = 0;
int tmp::sum = 0;

//运行的函数
int count(int n){
    tmp::init();
    tmp* a = new tmp[n];
    delete[] a;
    a = NULL;
    tmp::getsum();
}

int main(){
    cout << count(100) << endl;
    return 0;
}
3、利用虚函数、继承和函数指针

思路:
1. 定义两个类,A是基类,B是子类。
2. 定义一个A* Array[2],其中Array[0]存放A对象的地址,Array[1]存放B对象的地址。
3. 调用函数Sum中调用Sum的递归。同时对变量n两次取反Array[!!n]->Sum(n-1)+n,这样当n不为0的时候,得到bool值1。Array[!!n] = Array[1]
4. 当n=0调用基类A的sum。充分利用虚函数参数与类型有关的性质。

//1、虚函数
#include <iostream>
using namespace std;
class A;
A* Array[2];
class A
{
public:
    virtual int Sum(int n){
        return 0;
    }
};

class B:public A{
public:
    virtual int Sum(int n){
        //当 n != 0,!!n = 1
        return Array[!!n]->Sum(n-1)+n;
    }
};

int Sum2(int n){
    A a;
    B b;
    Array[0]=&a;
    Array[1]=&b;
    //调用虚函数
    int value=Array[1]->Sum(n);
    return value;
}

int main(){
    cout<< Sum2(100) <<endl;
    return 0;
}

//2、同上,这里利用的是函数指针来实现。
typedef int (*fun)(int);

int solution3_f1(int i){
    return 0;
}

int solution3_f2(int i){
    fun f[2]={solution3_f1, solution3_f2};
    return i+f[!!i](i-1);
}
4、利用异常处理的机制

思路:try接收到的异常会在catch中捕获。

public int sum(int n){
    try{
        //n = 2 的时候,出现异常,程序流跳转到catch
        int[] array = new int[n-2];
        return n+sum(n-1);
    }
    catch(Exception e){
        //返回1到上一个递归处,n = 2处。
        return 1;
    }
}
5、利用模板

思路:利用了模板的特化作为递归结束的条件,并借用枚举类型。

#include <iostream>
using namespace std;

template <unsigned N>
class Sum{
    public:
        enum{
            sum = N+Sum<N-1>::sum
        };
};
//模板特化,当N=1 的时候,调用
template<>
class Sum<1>{
    public:
        enum{
            sum = 1
        };
};

int main(){
    cout << Sum<100>::sum << endl;
    return 0;
}
### 7.1 实验题目 用ADI法解下列二维抛物方程初边值问题的解: \[ \begin{cases} \frac{\partial u}{\partial t}=\frac{1}{4^2}(u_{xx}+u_{yy}), (x,y)\in G=(0,1)\times(0,1),t > 0,\\ u(0,y,t)=u(1,y,t)=0, 0 < y < 1,t > 0,\\ u_y(x,0,t)=u_y(x,1,t)=0, 0 < x < 1,t > 0,\\ u(x,y,0)=\sin\pi x\cos\pi y. \end{cases} \] 精确解为:$u(x,y,t)=\sin\pi x\cos\pi y\exp(-\frac{\pi^2}{8}t)$。取空间步长$h = h_1 = h_2=\frac{1}{40}$,时间步长$\tau=\frac{1}{1600}$,网比$r = \frac{\tau}{h^2}=1$。计算到时间层$t = 1$,列出在节点$(x_j,y_k)$,$j,k = 1,2,3$的计算结果。并画出精确解曲面数值解曲面。 ### 7.2 实验原理 #### 第一步:网格剖分 设$x_j = jh(j = 0,1,\cdots,J)$,$y_k = kh(k = 0,1,\cdots,K)$,$t_n = n\tau(n = 0,1,\cdots,N)$差分解为$u^n_{j,k}$,则边值条件为: \[ \begin{cases} u^n_{0,k}=u^n_{J,k}=0, k = 0,\cdots,K\\ u^n_{j,0}=u^n_{j,1},u^n_{j,k - 1}=u^n_{j,k}, j = 0,1,\cdots,J. \end{cases} \] 初值条件为:$u^0_{j,k}=\sin\pi x_j\cos\pi y_k$。 #### 第二步:计算过程 从$n$到$n + 1$时,根据边值条件$u_{0,k}=u_{j,k}=0,k = 0,1,\cdots,K$,已经知道第0列第$K$列数值全为0。 (i) 从$n\rightarrow n+\frac{1}{2}$,$u^{n+\frac{1}{2}}_{j,k}$对$u_{xx}$向后差分,$u_{xx}$向前差分,构造出差分格式为: \[ \begin{align*} \frac{u^{n+\frac{1}{2}}_{j,k}-u^n_{j,k}}{\frac{\tau}{2}}&=\frac{1}{16}\left(\frac{u^{n+\frac{1}{2}}_{j + 1,k}-2u^{n+\frac{1}{2}}_{j,k}+u^{n+\frac{1}{2}}_{j - 1,k}}{h^2}+\frac{u^n_{j,k + 1}-2u^n_{j,k}+u^n_{j,k - 1}}{h^2}\right)\\ &=\frac{1}{16h^2}(\delta^2_xu^{n+\frac{1}{2}}_{j,k}+\delta^2_yu^n_{j,k}) \end{align*} \] 从而得到: \[ -\frac{1}{32}ru^{n+\frac{1}{2}}_{j + 1,k}+(1+\frac{1}{16}r)u^{n+\frac{1}{2}}_{j,k}-\frac{1}{32}ru^{n+\frac{1}{2}}_{j - 1,k}=\frac{1}{32}ru^n_{j,k + 1}+(1-\frac{1}{16}r)u^n_{j,k}+\frac{1}{32}ru^n_{j,k - 1} \] $j = 1,2,\cdots,J - 1$,$k = 1,2\cdots,K - 1$。 下面讨论$k = 1$时的情: 当$j = 1$,$-\frac{1}{32}ru^{n+\frac{1}{2}}_{2,1}+(1+\frac{1}{16}r)u^{n+\frac{1}{2}}_{1,1}-\frac{1}{32}ru^{n+\frac{1}{2}}_{0,1}=\frac{1}{32}ru^n_{1,2}+(1-\frac{1}{16}r)u^n_{1,1}+\frac{1}{32}ru^n_{1,0}$, 当$j = 2$,$-\frac{1}{32}ru^{n+\frac{1}{2}}_{3,1}+(1+\frac{1}{16}r)u^{n+\frac{1}{2}}_{2,1}-\frac{1}{32}ru^{n+\frac{1}{2}}_{1,1}=\frac{1}{32}ru^n_{2,2}+(1-\frac{1}{16}r)u^n_{2,1}+\frac{1}{32}ru^n_{2,0}$, …… 当$j = J - 2$,$-\frac{1}{32}ru^{n+\frac{1}{2}}_{J - 1,1}+(1+\frac{1}{16}r)u^{n+\frac{1}{2}}_{J - 2,1}-\frac{1}{32}ru^{n+\frac{1}{2}}_{J - 3,1}=\frac{1}{32}ru^n_{J - 2,2}+(1-\frac{1}{16}r)u^n_{J - 2,1}+\frac{1}{32}ru^n_{J - 2,0}$, 当$j = J - 1$,$-\frac{1}{32}ru^{n+\frac{1}{2}}_{J,1}+(1+\frac{1}{16}r)u^{n+\frac{1}{2}}_{J - 1,1}-\frac{1}{32}ru^{n+\frac{1}{2}}_{J - 2,1}=\frac{1}{32}ru^n_{J - 1,2}+(1-\frac{1}{16}r)u^n_{J - 1,1}+\frac{1}{32}ru^n_{J - 1,0}$。 再由边界条件得到$u^{n+\frac{1}{2}}_{0,1}=u^{n+\frac{1}{2}}_{J,1}=0$,则$k = 1$时,可以得到如下线性方程组: \[ \begin{bmatrix} 1+\frac{1}{16}r&-\frac{1}{32}r&&&&\\ -\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&&\\ &-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&\\ &&\ddots&\ddots&\ddots&\\ &&&-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r\\ &&&&-\frac{1}{32}r&1+\frac{1}{16}r \end{bmatrix} \begin{bmatrix} u^{n+\frac{1}{2}}_{1,1}\\ u^{n+\frac{1}{2}}_{2,1}\\ u^{n+\frac{1}{2}}_{3,1}\\ \vdots\\ u^{n+\frac{1}{2}}_{J - 3,1}\\ u^{n+\frac{1}{2}}_{J - 2,1}\\ u^{n+\frac{1}{2}}_{J - 1,1} \end{bmatrix} = \begin{bmatrix} g_{1,1}\\ g_{2,1}\\ g_{3,1}\\ \vdots\\ g_{J - 3,1}\\ g_{J - 2,1}\\ g_{J - 1,1} \end{bmatrix} \] 则$k = 2$时,可以得到如下线性方程组: \[ \begin{bmatrix} 1+\frac{1}{16}r&-\frac{1}{32}r&&&&\\ -\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&&\\ &-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&\\ &&\ddots&\ddots&\ddots&\\ &&&-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r\\ &&&&-\frac{1}{32}r&1+\frac{1}{16}r \end{bmatrix} \begin{bmatrix} u^{n+\frac{1}{2}}_{1,2}\\ u^{n+\frac{1}{2}}_{2,2}\\ u^{n+\frac{1}{2}}_{3,2}\\ \vdots\\ u^{n+\frac{1}{2}}_{J - 3,2}\\ u^{n+\frac{1}{2}}_{J - 2,2}\\ u^{n+\frac{1}{2}}_{J - 1,2} \end{bmatrix} = \begin{bmatrix} g_{1,2}\\ g_{2,2}\\ g_{3,2}\\ \vdots\\ g_{J - 3,2}\\ g_{J - 2,2}\\ g_{J - 1,2} \end{bmatrix} \] 依此类推:则$k = K - 1$时,可以得到如下线性方程组: \[ \begin{bmatrix} 1+\frac{1}{16}r&-\frac{1}{32}r&&&&\\ -\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&&\\ &-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&\\ &&\ddots&\ddots&\ddots&\\ &&&-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r\\ &&&&-\frac{1}{32}r&1+\frac{1}{16}r \end{bmatrix} \begin{bmatrix} u^{n+\frac{1}{2}}_{1,K - 1}\\ u^{n+\frac{1}{2}}_{2,K - 1}\\ u^{n+\frac{1}{2}}_{3,K - 1}\\ \vdots\\ u^{n+\frac{1}{2}}_{J - 3,K - 1}\\ u^{n+\frac{1}{2}}_{J - 2,K - 1}\\ u^{n+\frac{1}{2}}_{J - 1,K - 1} \end{bmatrix} = \begin{bmatrix} g_{1,K - 1}\\ g_{2,K - 1}\\ g_{3,K - 1}\\ \vdots\\ g_{J - 3,K - 1}\\ g_{J - 2,K - 1}\\ g_{J - 1,K - 1} \end{bmatrix} \] 将上述方程组写成矩阵形式$AU^{n+\frac{1}{2}} = G$,其中 \[ A=\begin{bmatrix} 1+\frac{1}{16}r&-\frac{1}{32}r&&&&\\ -\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&&\\ &-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r&&\\ &&\ddots&\ddots&\ddots&\\ &&&-\frac{1}{32}r&1+\frac{1}{16}r&-\frac{1}{32}r\\ &&&&-\frac{1}{32}r&1+\frac{1}{16}r \end{bmatrix} \] \[ U^{n+\frac{1}{2}}=\begin{bmatrix} u^{(n + 1/2)}_{1,1}&u^{(n + 1/2)}_{1,2}&\cdots&u^{(n + 1/2)}_{1,J - 1}\\ u^{(n + 1/2)}_{2,1}&u^{(n + 1/2)}_{2,2}&\cdots&u^{(n + 1/2)}_{2,J - 1}\\ u^{(n + 1/2)}_{3,1}&u^{(n + 1/2)}_{3,2}&\cdots&u^{(n + 1/2)}_{3,J - 1}\\ \vdots&\vdots&\ddots&\vdots\\ u^{(n + 1/2)}_{J - 3,1}&u^{(n + 1/2)}_{J - 3,2}&\cdots&u^{(n + 1/2)}_{J - 3,J - 1}\\ u^{(n + 1/2)}_{J - 2,1}&u^{(n + 1/2)}_{J - 2,2}&\cdots&u^{(n + 1/2)}_{J - 2,J - 1}\\ u^{(n + 1/2)}_{J - 1,1}&u^{(n + 1/2)}_{J - 1,2}&\cdots&u^{(n + 1/2)}_{J - 1,J - 1} \end{bmatrix} \] \[ G=\begin{bmatrix} g_{11}&g_{12}&\cdots&g_{1,J - 1}\\ g_{21}&g_{22}&\cdots&g_{2,J - 1}\\ g_{31}&g_{32}&\cdots&g_{3,J - 1}\\ \vdots&\vdots&\ddots&\vdots\\ g_{J - 3,1}&g_{J - 3,2}&\cdots&g_{J - 3,J - 1}\\ g_{J - 2,1}&g_{J - 2,2}&\cdots&g_{J - 2,J - 1}\\ g_{J - 1,1}&g_{J - 1,2}&\cdots&g_{J - 1,J - 1} \end{bmatrix} \] 又根据边值条件得:$u^{n+\frac{1}{2}}_{j,0}=u^{n+\frac{1}{2}}_{j,1},u^{n+\frac{1}{2}}_{j,K - 1}=u^{n+\frac{1}{2}}_{j,K},j = 0,1,\cdots,J$,解出第0行$u^{n+\frac{1}{2}}_{j,0}$第$K$行$u^{n+\frac{1}{2}}_{j,K}(j = 1,2,\cdots,J - 1)$。而$j = 0$与$j = J$处的值由边值条件$u^{n+\frac{1}{2}}_{0,k}=u^{n+\frac{1}{2}}_{J,k}=0$得到。 (i) 第二步:从$n+\frac{1}{2}\rightarrow n + 1$,$u^{n+\frac{1}{2}}_{j,k}$对$u_{xx}$向前差分,$u_{yy}$向后差分,构造出差分格式为: \[ \begin{align*} \frac{u^{n + 1}_{j,k}-u^n_{j,k}}{\frac{\tau}{2}}&=\frac{1}{16}\left(\frac{u^{n+\frac{1}{2}}_{j + 1,k}-2u^{n+\frac{1}{2}}_{j,k}+u^{n+\frac{1}{2}}_{j - 1,k}}{h^2}+\frac{u^{n + 1}_{j,k + 1}-2u^{n + 1}_{j,k}+u^{n + 1}_{j,k - 1}}{h^2}\right)\\ &=\frac{1}{16h^2}(\delta^2_xu^{n+\frac{1}{2}}_{j,k}+\delta^2_yu^{n + 1}_{j,k}) \end{align*} \] 用python
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值