普通版
问题描述:
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。
输入:
骑士工作的天数
输出:
骑士获得的工资
样例输入:
7
样例输出:
18
解题思路:
先用循环记录在哪一阶段,领取几天相同的金币数量,再定义一个循环来领当天的金币,每领一次天数加一,直到天数等于n时停下,输出金币的数量。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int days=0,n,sum=0,i,j;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
sum=sum+i;
days++;
if(days==n)
{
break;
}
}
if(days==n)
{
break;
}
}
cout<<sum;
return 0;
}
优化版本
解题思路:
通过题目我们可以得出一个新的规律,领取金币天数和数量一致;金币的数量等于第几阶段的平方;比如n等于3,第一阶段是持续一天,每天一个,金币数刚好是12。第二阶段是每天2个持续两天,刚好是22;第一阶段和第二阶段刚好是12+22,当n剩余的天数不再足以支撑下一次循环(n<i)时会自动跳出循环,但是还要补循环没有算上的天数,利用剩余的天数*当前的阶段的金币数量,再加上循环求出的金币数量就得出了正确的结果。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int n,sum=0,i;
cin>>n;
for(i=1;i<=n;i++)
{
sum=sum+i*i;
n=n-i;
}
sum=sum+n*i;
cout<<sum;
return 0;
}