金币问题解析

文章描述了一个关于国王发放金币给骑士的数学问题,问题转化为计算在前K天骑士获得的金币总数。提出了将问题看作周期性模式并利用数学公式求解的方法,给出了一段C语言代码实现该计算。主要涉及序列求和与循环结构。
摘要由CSDN通过智能技术生成

金币问题


本人小白,望各位大佬批评指正,谢谢。

题目:国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
输入描述:
输入只有1行,包含一个正整数K,表示发放金币的天数。
输出描述:
输出只有1行,包含一个正整数,即骑士收到的金币数。
示例1
输入:
6
复制
输出:
14
复制
说明:
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。
题目解析:首先可以试着把转为数学问题去想,把每次连续得到相同金币的天数看成一个周期。
比如:1 22 333 444 555 ········mmm······
从上面我们不难发现,从第一周期到m周期,而周期数就等于每个周期的总天数也等于周期数中每天得到的金币数,每个周期的金币总数等于每个周期总天数的平方。 我们不妨设天数为k,k天时所在周期区域为第m个周期。

根据公式总天数=(首项+末项)乘以项数/2,即总数=(1+m)乘以m/2,总金币数=每个周期天数平方之和=m*(m+1)(2m+1)/6(这是一个公式)。

又分为种情况:
第一种:k天正好对应第m个周期的最后一天,这是最好的情况,直接用应用文本中的公式即可。
第二种:k天对应到m周期的某一天,这时总金币数=第一周期的金币数到第m-1个周期金币数之和+(k-第一周期的天数到第(m-1)个周期的天数之和)*m。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int m = 1;//周期数
	int k = 0;天数
	int ans = 0;//总金币数
	scanf("%d", &k);
	while ((1 + m) * m / 2 <= k)
	{
		m++;
	}
	m--;
	ans = m * (m + 1) * (2 * m + 1) / 6 + (k - (1 + m) * m / 2) * (m + 1);
	printf("%d", ans);
	return 0;
}

以上就是我的见解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值