[C#] 暴力破解一個國中的數學題目

  • 25
  • 0

最近臉書牆上一直出現這分享,就手癢寫了一下,後來順便複習一下國中數學?

原文連結

其實看到第一時間跟我本就忘記數學了,畢竟數學離我很遠了?(年紀大了),直覺就是想說這東西交給電腦就好啦

後來跑一下

           var sp = new Stopwatch();

           sp.Start();

           Parallel.For(1, 10, a =>
           {
               Parallel.For(1, 10, b =>
               {
                   Parallel.For(1, 10, c =>
                   {
                       Parallel.For(1, 10, d =>
                       {
                           long left = 25870 + a;
                           int right = (int)Math.Pow(2, b) * c * d * d * 11; // 2^b * c * d² * 11

                           if (left == right)
                           {
                               Console.WriteLine($"a={a}, b={b}, c={c}, d={d}, sum={left}");
                           }
                       });
                   });
               });
           });
           Console.WriteLine(sp.Elapsed);
           
           //a=2, b=3, c=6, d=7, sum=25872
           //a=2, b=4, c=3, d=7, sum=25872
           //00:00:00.0154183

有兩個答案 2367,2437 ,後來看一下面的留言,答案是 2436 為什麼呢?

因為 題目有講到 標準分解式 (原來有定義根本就壓根忘記 : 標準分解式是將一個合數表示成質數的乘積,並將相同質因數按照由小到大的順序,以指數形式表示的方法)

所以因數 c,d  都要為質數,則 b 為指數所以可以是 4 

之後再修正一下


       /// <summary>
       /// 簡單判斷是不是質數,反正在10以內,不可能太久
       /// </summary>
       /// <param name="n"></param>
       /// <returns></returns>

        static bool IsPrime(int n)
        {
            if (n < 2) return false;
            for (int i = 2; i * i <= n; i++)
                if (n % i == 0)
                    return false;
            return true;
        }
        
        	var sp = new Stopwatch();

           sp.Start();
           Parallel.For(1, 10, a =>
           {
               Parallel.For(1, 10, b =>
               {
                   Parallel.For(1, 10, c =>
                   {
                       Parallel.For(1, 10, d =>
                       {
                           // 檢查 c 是否是質數
                           if (!IsPrime(c))
                               return;

                           int left = 25870 + a;
                           int right = (int)Math.Pow(2, b) * c * d * d * 11; // 2^b * c * d² * 11

                           if (left == right)
                           {
                               lock (Console.Out)
                                   Console.WriteLine($"a={a}, b={b}, c={c}, d={d}, sum={left}");
                           }
                       });
                   });
               });
           });
           Console.WriteLine(sp.Elapsed);
           
           
           //a=2, b=4, c=3, d=7, sum=25872
           //00:00:00.0189032
           

很無聊就當練習一下,不過無聊的人好像不只有我一個,哈哈哈~~


 

 

 


 

---

請你暫時把你的勇氣給我 在夢想快消失的時候 讓我的 Code 用力的穿過天空 為愛我的人做一秒英雄 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力…

Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer.