『腸よ鼻よ』を読んだ

ganma.jp


三行感想

・最初の医者と点滴してくる看護師が酷ぇ……
・病気どうこうよりも病院を間違った感が凄い
・腸を全摘したらどうにかなるもんなん?栄養とかどうするんだろう?



蛙のおっさん(1) (月刊少年ライバルコミックス)

蛙のおっさん(1) (月刊少年ライバルコミックス)

蛙のおっさん(2) (講談社コミックス)

蛙のおっさん(2) (講談社コミックス)

Project Euler : Problem 39 『Integer right triangles』

〇△□(まるさんかくしかく)のくにのおうさま (PHPにこにこえほん)


周長から斜辺以外の1辺を求める

直角三角形の各辺をa,b,cとする(cは斜辺)、周長をpとすると、
a+b+c=p    (1)
となる。


 斜辺cはピタゴラスの定理により
c = \sqrt{\mathstrut a^{2}+b^{2}}
よって(1)は
a + b + \sqrt{\mathstrut a^{2}+b^{2}} = p    (2)
となる。


 pとaの値が決まっていてbを求めたい場合、(2)から
\sqrt{\mathstrut a^{2} + b^{2}} = p - a - b
a^{2} + b^{2} = (p - a - b)^{2}    (3)
a^{2} + b^{2} = p^{2} + a^{2} + b^{2} - 2pa - 2pb + 2ab


0 = p^{2} - 2pa - 2pb + 2ab
p^{2} - 2pa + 2b(a - p) = 0
2b(a - p) = -p^{2} + 2pa


b = \frac{-p^{2} + 2pa}{2(a - p)}
b = \frac{p(2a - p)}{2(a - p)}    (4)


というわけで(4)式を使ってbの値を決めることができる。


三角形になるかどうかの判定

 p, a,それとさっき求めたbの値を使って三角形になるかどうかの判定は(3)式を使う


コード
using System.Diagnostics;

namespace Problem39
{
    class Program
    {
        static void Main(string[] args)
        {
            P39 p = new P39();
            Debug.WriteLine(p.Solve());
        }
    }

    class P39
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public P39()
        {

        }

        /// <summary>
        /// 解く
        /// </summary>
        /// <returns></returns>
        public int Solve()
        {
            int maxPatternCount = 0;
            int maxP = 1;

            for (int p = 1; p <= 1000; p++)
            {
                int patternCount = SetSides(p);

                if (patternCount > maxPatternCount)
                {
                    maxPatternCount = patternCount;
                    maxP = p;
                }
            }

            return maxP;
        }

        /// <summary>
        /// 斜辺以外の辺を決める
        /// </summary>
        /// <param name="p">週長</param>
        /// <returns>三角形になるパターン数</returns>
        private int SetSides(int p)
        {
            int patternCount = 0;

            for (int a = 1; a < p / 2; a++)
            {
                int b = (p * (2 * a - p)) / (2 * (a - p));

                if (a > b) break;

                if (IsMakeTriangle(p, a, b) == true)
                {
                    patternCount++;
                }
            }

            return patternCount;
        }

        /// <summary>
        /// 三角形になるか?
        /// </summary>
        /// <param name="p">周長</param>
        /// <param name="a">辺1</param>
        /// <param name="b">辺2</param>
        /// <returns></returns>
        private bool IsMakeTriangle(int p, int a, int b)
        {
            if (a * a + b * b == (p - a - b) * (p - a - b))
            {
                //Debug.WriteLine(string.Format("{0},{1},{2}:{3}", a, b, a * a + b * b, a + b + Math.Sqrt(a * a + b * b)));
                return true;
            }

            return false;
        }
    }
}
答え

840
思ったより多い。



キクタニ トライアングル 15cm 打棒・吊り皮付き T-15

キクタニ トライアングル 15cm 打棒・吊り皮付き T-15

エーモン 三角停止板 国家公安委員会認定品(交F08-1) 6648

エーモン 三角停止板 国家公安委員会認定品(交F08-1) 6648

まる・さんかく・しかく

まる・さんかく・しかく

Project Euler : Problem 38 『Pandigital multiples』

Discover Japan_FOOD いま、美味しい。ニッポンのパン (エイムック)


途中まで勘違いしてた

 適当な数がパンデジタル数かどうか調べるものを作ってた。
連結積でパンデジタル数を作る方法を聞かれてるんだったw


コード
using System;
using System.Diagnostics;
using System.Text;

namespace Problem38
{
    class Program
    {
        static void Main(string[] args)
        {
            P38 p = new P38();
            Debug.WriteLine(p.Solve());
        }
    }

    class P38
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public P38()
        {

        }

        /// <summary>
        /// 解く
        /// </summary>
        public Int64 Solve()
        {
            Int64 maxNum = 0;

            for (int n = 2; n <= 9; n++)
            {
                //(1,2)の場合4-5桁必要、という感じで必要桁を求める
                int nd = 9 / n;
                int max = (int)Math.Pow(10, nd);
                int min = (int)Math.Pow(10, nd - 1);

                StringBuilder sb = new StringBuilder();

                for (int i = min; i < max; i++)
                {
                    sb.Clear();

                    //Concatenated product of i and (1, 2, ... , m) を求める
                    for (int m = 1; m <= n; m++)
                    {
                        sb.Append(i * m);
                    }

                    //値がパンデジタル数になってるかのチェックと比較
                    if(IsPandigital(sb.ToString()) == true)
                    {
                        Int64 pNum = Int64.Parse(sb.ToString());

                        if (maxNum < pNum)
                        { 
                            maxNum = pNum;
                            Console.WriteLine(maxNum);
                        }
                    }
                }
            }

            return maxNum;
        }


        /// <summary>
        /// パンデジタル数か?
        /// </summary>
        /// <param name="str">検査する文字列</param>
        private bool IsPandigital(string str)
        {
            //9桁でなければfalse
            if (str.Length != 9) return false;

            int[] numbers = new int[9];

            for (int i = 0; i < str.Length; i++)
            {
                int j = str[i] - '0' - 1;

                //-1だとfalse
                if (j == -1) return false;

                numbers[j]++;

                //字数カウンタが1より多いとfalse;
                if (numbers[j] > 1) return false;
            }

            return true;          
        }
        
    }
}
答え

932718654


9327 × 1 = 9327
9327 × 2 = 18654
ということでした。



プラレール 連結部品

プラレール 連結部品

連結バイブル―国家試験から実務まで (大原の会計士受験シリーズ)

連結バイブル―国家試験から実務まで (大原の会計士受験シリーズ)

『蒼き鋼のアルペジオ 14』を読み終わった

蒼き鋼のアルペジオ 14 (ヤングキングコミックス)


三行感想

・読んでる途中で「誰?」ってなって13巻読んでないのに気づいた
・今なら北管区から芋をピストン輸送して食料改善できそう
・ズイカクは相変わらず釣りバカ可愛い