牛客网练习 小数列的和 小球反弹距离和高度问题

1,计算9+99+999+   +9999999999(10个9)

方法一 每个数都是上一个数乘10加9

#include <iostream>

using namespace std;

int main(){

    long long num=0,sum=0;

    for(int i=1; i<=10; i++){

        num=num*10+9;     //0+9;90+9;900+99;...

        sum+=num;

    }

    cout<<sum;

    return 0;

}

方法二 每个数都是10的n次方-1

#include <iostream>
using namespace std;
#include<cmath>
int main() {
    long long sum = 0;

    for(int i=1;i<=10;i++)
    {
        sum +=pow(10,i)-1;
    }
    
    cout<<sum<<endl;
    

    return 0;
}

2.小球开始h,每次反弹高度都是原来的一半,求反弹n次的距离和反弹高度,如100 1,输出结果100.0 50.0

int main() {

    // 下落的高度和落地的次数
    double h;
    int n;

    cin >> h;
    cin >> n;
    double sum = 0;
    while(n){           
        sum = sum+h;   //下降高度累加
        h = h/2;      //反弹高度(下次上升高度)
        if(--n)
        sum = sum+h;   //上升高度累加
    }
    cout <<fixed<<setprecision(1)<<sum<<" "<<h;

    return 0;
}

小球先下降,再判断下次反弹高度,根据反弹高度确定下次要上升的高度。而停止的时候,只需要下降高度累加,和上升高度,不需要把上升高度累加,所以下降高度和上升高度是在一个判断里的,而且要先于上升高度累加。

上升高度累加停止在--n的时候(可以用3举例,反弹到第三次不再上升,即3减到0时,假值,停止上升),这个时候n已经进行了-1操作,再让他去控制下降高度让他别执行,那么下降高度就可以用n约束,每次--n后再赋给n。大家有没有想过为什么要先控制上升高度累加,这是因为我们要用反弹值,也就是h/=2,所以上一轮得出这一轮需要上升的高度后,我们再拒绝他上升,就可以既不累加,但可以保留这个高度了。

执行顺序:先下降再上升

终止顺序:先终止上升,再终止下降

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值