C语言习题集

(1)求序数的前n项和, 输出一个正整数n,输出2/1+3/2+5/3+8/5…的前n项和(每一项的分子是前一项的分子和分母之和,分母是前一项的分子),保留两个小数输出.

解:
假设分子为 a =A(n), 分母为b=B(n), 第n项的值:F(n)=A(n)/B(n);
那么:
前n项的值: sum(n) = 2/1 +3/2+5/3+8/5……..A(n-1)/B(n-1)+A(n)/B(n).
然后可以变形:(就是加1,再减1),作为第0项
sum(n) = 1/1+2/1 +3/2+5/3+8/5……..A(n-1)/B(n-1)+A(n)/B(n) -1
我们分析每一项的关系:

项数AB
011
121
232
253
285
…..
n-2A(n-2)B(n-2)
n-1A(n-1)B(n-1)
nA(n)B(n)

这里我们很容易猜测出:

A(n)=A(n-1)+A(n-2)
B(n)=B(n-1)+(n-2)

真的吗?我们做推论.

根据:每一项的分子是前一项的分子和分母之和,分母是前一项的分子

那么:在n>2的时候:
A(n) = A(n-1)+B(n-1)
B(n) =A(n-1) =A(n-2)+A(n-3)=B(n-1)+B(n-2);

—> A(n) = A(n-1) +A(n-2);
—> B(n) =B(n-1)+B(n-2);

其实际就是斐波拉契数列
同时: A(0)=1 ,B(0)=1; A(1)=2 B(1)=1;

那么我们就可以码代码了:

#include <stdio.h>


//求第n项的B
float fB(int n)
{

    if(n==0||n==1){
        return 1.0;
    }else{

        return  fB(n-1)+fB(n-2);

    }


}

//A   B
//1   1
//2   1
//3   2
//5   3
//8   5

//求第n项的A
float fA(int n)
{

    if(n==0){
        return 1.0;
    }else if(n==1){
        return 2.0;
    }else{
        return  fA(n-1)+fA(n-2);
    }  
}
//求第n项的值
float f(int n)
{
    return fA(n)/fB(n);
}

float sumbynum(int n)
{
    int i =0;
    float sum = 0;

    for(;i<=n;i++)
    {

        sum+=f(i);

    }

    //最后,记得减一
    //sum(n) = 1/1 + 2/1 +3/2+5/3+8/5........A(n-1)/B(n-1)+A(n)/B(n)   -1
    sum--;

    return sum;

}


int main(int argc, const char * argv[]) {

    int n =20;//这里是输入的项数

    printf("%f\n",sumbynum(n));

    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值