这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战
题目描述
有个小伙子想存钱,一周七天,周一存1块钱,第二天比第一天多一块钱,依次类推,直到周日;
第二周的第一天比第一周的第一天多一块,第二天比第一天多一块钱,依次类推,直到周日;
后面以此类推。
问:第n天后小伙子可以总共存多少钱
举个例子:
n = 4
输出 10 (1+2+3+4)
n = 10
输出 37 (1+2+3+4+5+6+7)+(2+3+4)
n = 16
输出 70 (1+2+3+4+5+6+7)+(2+3+4+5+6+7+8)+(3+4)
思路分析
我们可以从给的例子中找到规律
- 第一周存够7天,则会存到28块(1+2+3+4+5+6+7)
- 第二周存够7天,则会存到35块(2+3+4+5+6+7+8)
- 第三周存够7天,则会存到42块(3+4+5+6+7+8+9)
每周都会比上周多7块,但是这种情况是取决于你存满了7天。
如果你存不满7天,就得把前面几天相加。
所以我们就得分2部分,存满7天和不满7天,二者相加就是最后的结果。
代码
我们可以把对天数n进行除以7求商取整,这个就是满7天的次数。
对天数n就进行除以7取余,这个就是不满7天的天数。
然后遍历满7天的次数,以28为基数(第一周的总和),每次都逐级加7,直到和满7天的次数相等,才停止。(这里我使用while遍历)
然后对于不满7天的天数,以满7天的次数为基数(因为每周的第一天都比上一周的第一天多一块,和满7天的次数相等),然后都逐级加1,直到等于不满7天的天数。(这里我使用while遍历)
把2次结果相加,就是需要返回的结果。
代码如下:
/**
* @param {number} n
* @return {number}
*/
var totalMoney = function (n) {
let res = 0
let i1 = 0
let i2 = 0
const n1 = parseInt(n / 7)
const n2 = n % 7
// 满7天的
while (i1 < n1) {
res += (28 + 7 * i1++)
}
// 不满7天的
while (i2 < n2) {
res += (++i2 + n1)
}
return res
};
大家如果还有别的做法欢迎评论交流。