noi 1.5 45:金币

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noi 1.5 45:金币相关的知识,希望对你有一定的参考价值。

描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。

你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。

输入

一个整数(范围1到10000),表示天数。

输出

骑士获得的金币数。输入一个整数(范围1到10000),表示天数。输出骑士获得的金币数。

样例输入

6

样例输出

14






法一
#include<iostream>
using namespace std;
int n;
int main()
{
    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;

法二

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,t=0,s=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++) 
        {  
            if(t>=n) break;//eg:t=6时说明已经循环了6天,当t=6进入循环是已经是第七天的钱
            s=s+i;
            t++;//t表示已经过的天数
        }
    }
    cout<<s;
    return 0;
}

 

以上是关于noi 1.5 45:金币的主要内容,如果未能解决你的问题,请参考以下文章

NOI 1.5 42:画矩形

noi 1.5 43:质因数分解

noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T37——T38

NOI 1.5编程基础之循环控制 44:第n小的质数

NOI 1.5 44:第n小的质数

NOIP2015普及组 T1金币