帮求小王60天获得金币数

小王学习表现好,大王奖励了他一袋金币。当天小王便欢天喜地用掉了一半,回府路上又多用了一个金币:第二天将剩下的金币用掉一半后,又多用了一个:以后每天都先用掉前一天剩下金币的一半,再多用一个:到第 60天早上想再用时,就发现只剩下一个金币了。请编程求出小王获奖的金币个数和解题过程思路


#include<iostream>
using namespace std;
int main()
{
    long long ret = 1, sum = 0;
    for (int i = 60; i>=1;i--)
    {
        ret = ret * 2 + 1;
        sum += ret;
    }
    cout << sum << endl;
    return 0;
}

首先根据题意是倒着推理,小王每天赚了一个金币再赚2倍。
输入是赚之前(下午)的金币,输出是赚之后(早上)的金币。
这是一个重复的动作。对应到代码里就是一个重复的函数。那么函数原型和实现就出来了:

int earn_coins(int coins)
{
    return (coins + 1) * 2;
}

小王拿着M金币重复执行了N次,这里M为1,N为60也好59也好随意了。
那么这个计算过程的输入就是M和N,输出就是最终金币数。函数原型和实现也就出来了:

int calc(int coins, int loops)
{
    for (int i = 0; i < loops; i++)
    {
        coins = earn_coins(coins);
    }
    return coins;
}