求1+2+3+.....+n的几种解法

题目描述: :求1+2+…+n,

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

话说这个一下子只能想到递归啦,但是还是要用到条件判断啊,于是乎这个怎么办尼?在网上各大牛的帮助下,找到了几个解法,收获颇多,分享之。。。

//求1+2+3...+n,不能用if,while,for,case,a?b:c,等
//solution2:一个构造函数初始化n次,每次在构造函数中加n,也可以求出结果
#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){return Array[!!n]->Sum(n-1)+n;}
};// !!n表示将一个整数变成1,即bool类型,如果是0的话,!!0仍然是0
int Solution1_Sum(int n)
{
    A a;
    B b;
    Array[0]=&a;
    Array[1]=&b;
    int value=Array[1]->Sum(n);
    return value;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
#if 1
class C{
public:
    C(){n++;sum+=n;}
    static void Reset(){sum=0;n=0;}//这是为了在每次求n的和之前清零的
   static  int getSum(){return sum;}
private:
    static int n;
    static int sum;
};
int C::n=0;
int C::sum=0;
int Solution2_Sum(int n)
{
    C::Reset();
    //申明类数组,用一个指针指向他们
    C *p=new C[n];
    delete []p;//一定要记得释放空间哦,否则不仅指针空间没有释放,n个对象也不会调用析构函数的
    p=0;
    return C::getSum();//在没有对象的时候,对于一般的成员函数不能使用类名来调用,
    //故这里如果要这样用的话就要把getSum定义成staic函数
}
#endif
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef int (*fun)(int);//指的是定义一个返回值和参数类型都为Int的函数指针
int Solution_f1(int i)
{
    return 0;
}
int Solution_f2(int i)
{
    fun f[2]={Solution_f1,Solution_f2};
    return i+f[!!i](i-1);//调用f[0]或f[1],参数为i-1
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int main()
{
    //solution2
    int all;
   all=Solution2_Sum(5);
   // all=solution1_Sum(5);
    cout<<all<<endl;
    //solution1
    all=Solution1_Sum(6);
    cout<<all<<endl;
    //solution3
    cout<<Solution_f2(10)<<endl;
    //solution4


}

注:今天又看到一种解法,共享之:

利用&&的短路性质,结束递归

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非线性方程数值解法: 1.二分法:这是一种最简单的数值解法,但它收敛速度较慢,只有在函数单调性和连续性的条件下才能使用。 2.牛顿法:利用曲线的切线来逼近方程的根,需要一阶导数存在且连续。 3.割线法:牛顿法的改进版,使用两个点来逼近方程的根。 4.弦截法:割线法的改进版,使用一个点和斜率来逼近方程的根。 5.迭代法:通过不断逼近根来解方程,需要选择合适的迭代函数。 非线性方程组的几种数值解法: 1.牛顿法:将非线性方程组转化为一个线性方程组,需要计算雅可比矩阵。 2.拟牛顿法:与牛顿法似,但是不需要计算雅可比矩阵。 3.高斯-赛德尔迭代法:将方程组的解逐个逼近。 4.雅可比迭代法:将方程组的每个未知数的解逐个逼近。 这里提供一个使用牛顿法解非线性方程组的 Matlab 源代码: ```matlab function [x,iter]=newton(f,df,x0,tol,maxiter) % f:目标函数 % df:目标函数的一阶导数 % x0:初值 % tol:误差容限 % maxiter:最大迭代次数 % x:方程的解 % iter:迭代次数 x=x0; iter=0; while norm(f(x))>tol && iter<maxiter x=x-inv(df(x))*f(x); iter=iter+1; end if iter==maxiter fprintf('迭代次数达到上限,可能无解或解收敛缓慢!\n'); else fprintf('迭代成功,迭代次数:%d\n',iter); end end ``` 使用方法: 1.定义目标函数和一阶导数 例如,解方程组 $\begin{cases}x^2+y^2=1\\x-y=0\end{cases}$,定义目标函数和一阶导数: ```matlab f=@(x)[x(1)^2+x(2)^2-1;x(1)-x(2)]; df=@(x)[2*x(1),2*x(2);1,-1]; ``` 2.设置初值、误差容限和最大迭代次数 例如,设置初值 $x_0=[1;1]$,误差容限 $10^{-6}$,最大迭代次数 $100$: ```matlab x0=[1;1]; tol=1e-6; maxiter=100; ``` 3.调用函数解 ```matlab [x,iter]=newton(f,df,x0,tol,maxiter); ``` 完整代码: ```matlab clear;clc; f=@(x)[x(1)^2+x(2)^2-1;x(1)-x(2)]; df=@(x)[2*x(1),2*x(2);1,-1]; x0=[1;1]; tol=1e-6; maxiter=100; [x,iter]=newton(f,df,x0,tol,maxiter); fprintf('方程的解为:\n'); disp(x); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值