/*【题目】
标题:海盗分金币
有5个海盗,相约进行一次帆船比赛。
比赛中天气发生突变,他们被冲散了。
恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人。
第一个人在沙滩上发现了一堆金币。他把金币分成5等份。发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,
然后把属于自己的那份拿走。
第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,
拿走了属于自己的那份。
第三,第四,第五人的情况一模一样。
等他们到了目的地,都说自己的情况,才恍然大悟,一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:
岛上还有一千多枚金币呢!
请你根据这些信息,推算荒岛上最初有多少金币?
【韶关学院蓝桥集训解题报告要求:需要根据题意来编程得出答案,不可直接给个答案】
*/
/*【解题思路】
数学公式推导:
设变量surplus为当第五个人拿走属于自己的那份后岛上的剩余金币数,surplus的取值范围为1000~2000,
当第五个人来岛上时岛上剩余的金币数a_5为:a_5 = (surplus + surplus/4)-1; (其中surplus可被4整除,即surplus%4 == 0)
当第四个人来岛上时岛上剩余的金币数a_5为:a_4 = (a_5 + a_5/4)-1; (其中a_5可被4整除,即a_5 % 4 == 0)
当第三个人来岛上时岛上剩余的金币数a_5为:a_3 = (a_4 + a_5/4)-1; (其中a_4可被4整除,即a_4 % 4 == 0)
当第二个人来岛上时岛上剩余的金币数a_5为:a_2 = (a_3 + a_5/4)-1; (其中a_3可被4整除,即a_3 % 4 == 0)
当第一个人来岛上时岛上剩余的金币数a_5为:a_1 = (a_2 + a_5/4)-1; (其中a_2可被4整除,即a_2 % 4 == 0)
最后的条件是: (a_1 + 1) % 5 == 0
推导出公式为:a_i = ( a_(i-1) + a_(i-1)/4) - 1; (其中a_i可被4整除,即a_i % 4 == 0)
得出以上规律和条件后,即可编程序解决问题了
得出答案为:3129
*/
#include<iostream>
using namespace std;
int main()
{
int surplus;//表示每次岛上剩余的金币数
bool flag;//用于下方surplus是否能被4整除的标志变量
for(int i = 1000;i < 2000;i++)
{
flag = true;
surplus = i;
for(int j=0;j<5;j++)
{
if(surplus%4 != 0)
flag = false;
surplus = (surplus+surplus/4)-1;
}
if(flag && (surplus+1) % 5 == 0)//如果运算到最后满足题目的条件则输出答案
cout<<surplus<<endl;
}
return 0;
}
标题:海盗分金币
有5个海盗,相约进行一次帆船比赛。
比赛中天气发生突变,他们被冲散了。
恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人。
第一个人在沙滩上发现了一堆金币。他把金币分成5等份。发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,
然后把属于自己的那份拿走。
第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,
拿走了属于自己的那份。
第三,第四,第五人的情况一模一样。
等他们到了目的地,都说自己的情况,才恍然大悟,一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:
岛上还有一千多枚金币呢!
请你根据这些信息,推算荒岛上最初有多少金币?
【韶关学院蓝桥集训解题报告要求:需要根据题意来编程得出答案,不可直接给个答案】
*/
/*【解题思路】
数学公式推导:
设变量surplus为当第五个人拿走属于自己的那份后岛上的剩余金币数,surplus的取值范围为1000~2000,
当第五个人来岛上时岛上剩余的金币数a_5为:a_5 = (surplus + surplus/4)-1; (其中surplus可被4整除,即surplus%4 == 0)
当第四个人来岛上时岛上剩余的金币数a_5为:a_4 = (a_5 + a_5/4)-1; (其中a_5可被4整除,即a_5 % 4 == 0)
当第三个人来岛上时岛上剩余的金币数a_5为:a_3 = (a_4 + a_5/4)-1; (其中a_4可被4整除,即a_4 % 4 == 0)
当第二个人来岛上时岛上剩余的金币数a_5为:a_2 = (a_3 + a_5/4)-1; (其中a_3可被4整除,即a_3 % 4 == 0)
当第一个人来岛上时岛上剩余的金币数a_5为:a_1 = (a_2 + a_5/4)-1; (其中a_2可被4整除,即a_2 % 4 == 0)
最后的条件是: (a_1 + 1) % 5 == 0
推导出公式为:a_i = ( a_(i-1) + a_(i-1)/4) - 1; (其中a_i可被4整除,即a_i % 4 == 0)
得出以上规律和条件后,即可编程序解决问题了
得出答案为:3129
*/
#include<iostream>
using namespace std;
int main()
{
int surplus;//表示每次岛上剩余的金币数
bool flag;//用于下方surplus是否能被4整除的标志变量
for(int i = 1000;i < 2000;i++)
{
flag = true;
surplus = i;
for(int j=0;j<5;j++)
{
if(surplus%4 != 0)
flag = false;
surplus = (surplus+surplus/4)-1;
}
if(flag && (surplus+1) % 5 == 0)//如果运算到最后满足题目的条件则输出答案
cout<<surplus<<endl;
}
return 0;
}