ylbtech-Arithmetic:Console-算法[for,if,break]-五个好朋友分苹果 |
1.A,案例 |
-- ========================================================
-- ylb:算法
-- Type:算法[for,if,break]
-- munu:五个好朋友分苹果
-- thankyou:sunshine
-- ylb:算法
-- Type:算法[for,if,break]
-- munu:五个好朋友分苹果
-- thankyou:sunshine
-- 13:02 2012/3/17
-- ========================================================
-- ========================================================
五个好朋友分一堆苹果,第一个人把苹果分成5份,为了公平,扔掉了多余的1个苹果,拿上自己一份走了。第二人来了,把剩余的苹果分成5份,扔掉多余的1个,拿上自己一份走了。以后来的三个人都是这样做的。那么,最初有多少个苹果呢?
分析:
根据分苹果的方法我们可以看出,每个人分苹果时都是扔掉1个后变成了5的整数倍,所以才能分成5份。那么当这个人拿去一份后,剩余的是4份苹果,所以剩余的数一定是4的整数倍。所以,每个人所看到的数目一定是减1后,既是5的整数倍,又是4的整数倍。因此可构建为:1+4+5+X(X为未知的正整数或0)。
设m为第i个人所看到的苹果数,n代表第i-1个人所看的到苹果数,那么这两个数字应该满足这样的关系:m=(n-1)/5*4
例如当i=2时,代表第2个人所看到的苹果数=(第一个人看到的苹果数减去1个,再分成5份,因为第一个人拿走1份,所以乘以4份)。所以,这个表达式成立。
因此m和n都应该满足1+4*5*X这个表达式。这是一个二重循环,外循环不能确定执行多少次,只好总最小数21开始试算。内循环判断苹果数是否能被5整除,如果不能被整除则退出内循环,外循环的苹果数直接加20。因为20是满足既能被5整除,又能被4整除的最小数。
从1开始的原因1是最小的满足1=1+4*5*X的正整数(当X为0时)。
1.B,解决方案 |
using System; namespace ConsoleApplication1 { class Program { /// <summary> /// ylb:五个好朋友分苹果 /// 12:56 2012/3/17 /// </summary> /// <param name="args"></param> static void Main(string[] args) { int i, m, n = 1; for (; ; ) { n = n + 4 * 5; m = n; for (i = 0; i < 5; i++) { if ((m - 1) % 5 != 0) break; else m = (m - 1) / 5 * 4; } if (i == 5) break; } Console.WriteLine(string.Format("原来有{0}个苹果!",n)); } } }
1.C,运行结果 |
原来有3121个苹果!
请按任意键继续. . .
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |