第1章:绪论

第1章:绪论

1、三数交换

/**********
【题目】试写一算法,如果三个整数a,b和c的值
不是依次非递增的,则通过交换,令其为非递增。
***********/
void Descend(int &a, int &b, int &c) //这里的引用改变a的值也会改变n的值
/* 通过交换,令 a >= b >= c */
{
   
    /*这里的&a是说给一个变量起一个别名,a的值改变,
    原变量即实参的值也改变,但是在dev c++编译不通过*/
    int temp;
    if(a < b){
   
        temp = a;
        a = b;
        b = temp;
    }
    
     if(a < c)
     {
   
       temp = a;
        a = c;
        c = temp;
     }
    
     
    if(b < c)
    {
   
        temp = b;
        b = c;
        c = temp;
    }
}

2、一元多项式求值

/**********
【题目】试编写算法求一元多项式
    P(x) = a0 + a1x + a2x^2 + ... + anx^n
的值P(x0),并确定算法中每一语句的执行次数和整个算法
的时间复杂度。
**********/
float Polynomial(int n, int a[], float x)
/* 求一元多项式的值P(x)。                  */
/* 数组a的元素a[i]为i次项的系数,i=0,...,n */
{
   
    int i;
    float sum;
    if(n == 0){
   
        sum = a[0];
        return  sum;//处理只有a0的情况
    }   
    sum = a[n] * x + a[n-1];
    for(i = n-2;i >= 0 ;i --)
    {
   
        sum =  sum * x + a[i] ;//秦九韶算法
    }
    return sum;
}

3、k阶斐波那契序列

/**********
【题目】已知k阶裴波那契序列的定义为
    f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;
    f(n)=f(n-1)+f(n-2)+...+f(n-k), n=k,k+1,...
试编写求k阶裴波那契序列的第m项值的函数算法,
k和m均以值调用的形式在函数参数表中出现。
**********/
Status Fibonacci(int k, int m, int &f) 
/* 求k阶斐波那契序列的第m项的值f,如果能求得,返回OK */
/*否则(如参数k与m不合理),返回ERROR*/
{
   
    //这里的序列定义跟斐波那契数列不太一样
    //K不可以为1,因为f(k-2)=0,至少大于等于2
    //k-1项总为1,第k项往后等于前面k项之和
    //如K = 3,则f(k)=f(2)+f(1)+f(0);
    if(k < 2 || m < 0){
   
        return ERROR;
    } 
    //前k-2项都为0
    int i,j,t[100] = {
   0,0},sum = 0;
    if(m < k-1) f = 0; 
    else if(m == k-1) f = 1;
    else {
   
        t[k-1] = 1;//k-1项为1
        for(i = k;i <= m;i ++){
   //给第k项~m项赋值
           for(j = i - k;j < i;j ++){
   
                sum += t[j];//前k项之和
           }
           t[i] = sum;//赋值给第k项~m项
           sum = 0;//记得归零
        }
        f = t[m];       
    }
    return OK;
}
优化
  • 上面的当求第m+1项后明显有问题,而且用来双重循环,耗费时间也比较多,因此优化为下面的解法,可以求出任意项的值,而且只用了一次循环.
Status Fibonacci(int k, int m, int &f) 
/* 求k阶斐波那契序列的第m项的值f,如果能求得,返回OK */
/*否则(如参数k与m不合理),返回ERROR*/
{
       
    if(k <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值