小王学习表现好,大王奖励了他一袋金币。当天小王便欢天喜地用掉了一半,回府路上又多用了一个金币:第二天将剩下的金币用掉一半后,又多用了一个:以后每天都先用掉前一天剩下金币的一半,再多用一个:到第 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;
}