Console-算法[for,if,break]-五个好朋友分苹果

简介:
ylbtech-Arithmetic:Console-算法[for,if,break]-五个好朋友分苹果
 
1.A,案例
-- ========================================================
-- 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个苹果!
请按任意键继续. . .


,如需转载请自行联系原作者
相关文章
12【C语言 & 趣味算法】存钱问题(四层for循环,if判断)
12【C语言 & 趣味算法】存钱问题(四层for循环,if判断)
12【C语言 & 趣味算法】存钱问题(四层for循环,if判断)