方法一:

思路:

  1. 计算n天中一共经历了多少个完整的周,设为i
  2. 计算n天中最后一个不完整的周有多少天,设为j
  3. 最后的结果 = 完整周的存钱数 + 剩下天数的存钱数
    1. 完整周的存钱数:第一周存钱数为(1+7)*7*i/2,然后再加上后面几个完整周与第一周的差额即可:这个不是**7*i**,因为第i周将会与第1周差(i-1)*7天,并且相邻两周差额恒等于7,符合等差数列,所以所以可以算出差额的总钱数等于(第一周差的钱数 + 第i周差的钱数)*i/2(0 + (i-1)*7)*i/2 天
    2. 剩下天数的存钱数:最后一周中,第一天存入1+i元,最后一天存入i+i+j-1元,一共j天,通过求和公式计算出最后一周的存钱数(1+i+1+i+j-1)*j/2
  1. class Solution {
  2. public:
  3. int totalMoney(int n) {
  4. // 一共经历了多少个完整的周
  5. int i = n / 7;
  6. // 最后一个不完整的周存钱数
  7. int j = n % 7;
  8. int ret = 0;
  9. if (i > 0)
  10. // 加上完整周一共经历的存钱数 = 每个周都为第一周的存钱数 * 周数 + 差额的钱数(这个不是7*i,因为第i周将会与第1周差(i-1)*7天,所以可以算出相差(0 + (i-1))*7*i/2 的金钱)
  11. ret += (1+7)*7*i/2 + 7*(i-1)*i/2;
  12. // 加上最后一周的存钱数
  13. ret += (1+i+1+i+j-1)*j/2;
  14. // 总金钱 = 完整周的钱 + 最后剩余的几天赚的钱
  15. return ret;
  16. }
  17. };