NOI 1.5 45

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int t=0,s=0,z=0;//t表示当前每天可以得到几枚金币,s表示当前金币总数,z表示当前总天数 
    while(1)
    {
        t++;
        if(t+z>n) 
            break;
        /*t=a既可以表示当前每天可以得到a枚金币,也可以表示得a枚金币的状态即将持续a天
        ,注意是即将持续,也就是这a*a枚金币在这时还没有累积,而z是当前已经计算了的天数。
        当t+z>n时,也就是如果用a*a的当时累加,会使得到金币的天数>n,
        所以要break,通过后面的for循环一天一天的加。*/
        
        s+=t*t;        //t*t为这t天一共可得的金币数
        z+=t;
    }
    for(int i=z+1;i<=n;i++) 
        s+=t;
    /*当上面t+z=n时,不会break,累加一次t*t,
    此时恰好得了n天的金币,z=n,for循环条件不满足,不执行。*/
    cout<<s;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值