มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

Last post 07-29-2008 15:18 by coreadmin. 7 replies.
Page 1 of 1 (8 items)
Sort Posts: Previous Next
  • 07-18-2008 21:38

    • soang
    • Top 10 Contributor
    • Joined on 06-30-2008
    • Posts 23

    มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    <a href='http://u3.upload.sanook.com/A0/6ce33a70b371ee9b17f5b82a30a97ba6'>http://u3.upload.sanook.com/A0/6ce33a70b371ee9b17f5b82a30a97ba6</a>

  • 07-18-2008 22:27 In reply to

    • soang
    • Top 10 Contributor
    • Joined on 06-30-2008
    • Posts 23

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    แก้ลิ้งครับ

     http://u3.upload.sanook.com/A0/6ce33a70b371ee9b17f5b82a30a97ba6

    อันนี้โค๊ดที่ผมลองทำดู แต่ยังไม่ถูกนะ

    http://u3.upload.sanook.com/A0/880a014717b8e545260c3f1f22407ff9

  • 07-19-2008 23:24 In reply to

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

     

    // cache to reduce number of recursion

    static Dictionary<int, int> _FactCache = new Dictionary<int, int>();

     

    static int Fact(int input)

    {

        if (input < 0) throw new ArgumentOutOfRangeException("Fact for < 0 is no defined");

        if (_FactCache.ContainsKey(input)) return _FactCache[input];

        if (input <= 1) return 1;

     

        int result = input * Fact(input - 1);

       _FactCache.Add(input, result);

     

        return result;

    }

     

    static double Sin(double x)

    {

        double result = x;

       bool minus = true;

        int power = 3;

     

        while (true)

        {

            if (double.IsInfinity(Math.Pow(x, power))) break;

     

            double currentResult = Math.Pow(x, power) / Fact(power);

     

            if (double.IsInfinity(result - currentResult)) break;

            if (double.IsInfinity(result + currentResult)) break;

     

            if (minus)

            {

                result -= currentResult;

            }

            else

            {

                result += currentResult;

            }

     

            minus = !minus;

            power++;

       }

     

        return result;

    }

     

    ของผมคับ คิดออกมาแล้วเลขมันเพี้ยนไปเยอะเลย แต่ว่า ถ้ายิ่งค่าองศา (เรเดียน) น้อยๆ มันจะใกล้กันครับ

     

    PI/1
    My:   5295936.90699457
    Math: 1.22460635382238E-16
    PI/2
    My:   1.11493617480346
    Math: 1
    PI/3
    My:   0.897003518476566
    Math: 0.866025403784439
    PI/4
    My:   0.718309316964881
    Math: 0.707106781186547
    PI/5
    My:   0.592733064504933
    Math: 0.587785252292473
    PI/6
    My:   0.502504559480968
    Math: 0.5
    PI/7
    My:   0.435282086701046
    Math: 0.433883739117558
    PI/8
    My:   0.383523785669715
    Math: 0.38268343236509
    PI/9
    My:   0.342554898220715
    Math: 0.342020143325669
    PI/10
    My:   0.309373199761157
    Math: 0.309016994374947
    PI/11
    My:   0.281978858066394
    Math: 0.28173255684143
    PI/12
    My:   0.258994728365534
    Math: 0.258819045102521
    PI/13
    My:   0.239444311322423
    Math: 0.239315664287558
    PI/14
    My:   0.222617279785313
    Math: 0.222520933956314
    PI/15
    My:   0.207985263740032
    Math: 0.207911690817759
    PI/16
    My:   0.195147468636724
    Math: 0.195090322016128
    PI/17
    My:   0.183794576135041
    Math: 0.18374951781657
    PI/18
    My:   0.173684180981053
    Math: 0.17364817766693
    PI/19
    My:   0.164623702813137
    Math: 0.164594590280734

  • 07-19-2008 23:43 In reply to

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    ขอมาแก้ตัวให้ตัวเองนิ๊ดนึง

    สังเกตว่า ผมมี return หลายจุดหน่อย คือผมจะชอบเขียนให้มัน Return ไปเลย ถ้าเกิดมันจบเคสนั้นๆ ไปแล้ว แต่ว่าส่วนใหญ่ ชาวบ้านเขาจะบอกกันว่า ไม่ควรจะมี Return หลายที่ ผมคิดว่า นั่นคงเป็นคำแนะนำสำหรับ C++ เท่านั้นอะคับเพราะว่าใน Native Code เราอาจจะต้องมากำจัดขยะก่อนจะ Return ด้วย แต่ว่าใน C# เรามี GC ทำให้เราแล้ว จะ Return ตรงไหนเลยก้อน่าจะได้ จิงป่ะ

    แล้ว while loop เนี่ย เกือบจะ 100% เลย ที่ผมใช้ while (true) เหอๆ แนวคิดผมคือแบบว่า จะทำอะไรซ้ำๆ ซากๆ กันปุ๊บ ผมจะใช้ while(true) เลย (ยกเว้นอะไรที่มันชัดเจนว่า ใช้ for, foreach) แล้วมาหาทาง break เอาข้างใน จะได้ไม่ต้องมาคิดหลายตลบว่าจะต้องมีเงื่อนไขไหนบ้างที่มันจะต้องออก บลาๆๆๆๆ หรือว่าจะเช็คก่อนทำ หรือทำแล้วค่อยเช็ค อารมณ์มันเหมือนว่า เวลาเราคิดจริงๆ เราจะคิดไปตามลำดับมากกว่าจิงป่ะคับ

    ใครว่าไอเดียผมใช้ได้ เชิญเอาไปใช้ได้เลยนะคับ แต่ตอนเรียน อาจารย์ผม comment ยับเลย เหอๆ

  • 07-20-2008 19:11 In reply to

    • soang
    • Top 10 Contributor
    • Joined on 06-30-2008
    • Posts 23

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    ที่ว่า "จะต้องมากำจัดขยะก่อนจะ Return" มันมีอะไรที่เป็นขยะบ้างอ่ะครับ

    ใช้ while(true) ก็ดีครับแต่ต้องดักให้ถูก ^^

    ขอบคุณสำหรับโค๊ดนะครับ ใช้ได้เลย ดีกว่าของผมอีก 55

    ผมลองให้มันคิดเฉพาะเลขคี่ (x ยกกำลัง n แล้วก็ หารด้วย n!)

    while (true)

    {   for (int n = 3; n > 0; n++)

        {   if ((n % 2) != 0)

             {   //codeเดิม

             }

         }

        minus = !minus;

    }   ปัญหาคือรันแล้วมันคำนวณนานมาก ทิ้งไว้ก็ไม่ขึ้นสักที

     

     ส่วน code ด้านล่างนี้ พอ minus เป็น false มันก็ไม่ได้ทำตรง else ไม่เข้าwhile(true)

    โค้ดคุณcoreAdmin ตอนนี้มันทำได้แต่ ลบกันใช่ป่ะครับ คือในโจทย์มัน a+b-c+d-e+... ต้องแก้ยังไงดีครับ Smile

    if (minus)

    {    result -= currentResult;

    }

    else

    {    result += currentResult;

    }

    minus = !minus;

  • 07-23-2008 0:14 In reply to

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    พวกขยะ ถ้าสมัย c++ ก้อ พวก pointer ที่เราเอาไปยุ่งๆ ไว้อะคับ หรือพวกการสั่ง free เพื่อคืนแรมอะไรแบบนี้ ของ C# ก้อยังมีอยู่คับ พวก object ที่ต้อง Dispose ก้อควรจะสั่ง Dispose ก่อน Return เพราะมันจะไม่โดนเรียกจนกว่าจะโดนเก็บทิ้งโดย GC คับ

    แต่ผมยังคงหนีต่อไป โดยการใช้ using Big Smile จะได้ return ตามชอบใจได้เหมือนเดิม

    using ( DbConnection con = ... )
    {

         return;
    }

    Cool

    ส่วนตรงโค๊ดด้านท้าย มันคิดได้ทั้งบวกทั้งลบคับ ถ้า flag minus มันเป็น minus มันก้อจะเอาผลลัพธ์ไปลบ ( เทอมแรก - เทอมที่คิดได้รอบนี้) แล้วพอลบเสร็จ minus ก้อจะกลับข้าง ครั้งต่อไป พอคำนวน เทอมที่ 3 มัน ก้อจะเอามาบวก ( เทอมแรก - เทอมที่ 2 + เทอมที่คิดได้รอบนี้ ) มันก้อบวกลบ สลับกันแล้วครับ ถ้าจะให้เริ่มจากบวก ก้อเปลี่ยนค่า minus เป็น false ไว้ตอนต้นเท่านั้นเอง

    แต่ในโค๊ดคุณ soang มันก้อรันไปเรื่อยๆ ไม่มีวันจบคับ เพราะว่า int.MaxValue ก้อมากกว่า 0, int.PlusInfinity ก้อมากกว่า 0 บวกไปยังไงมันก้อไม่จบแน่คับ ยกเว่นจะมี break ข้างใน

    ในการ break ของผมจะใช้ double.IsInfinity ช่วยดูว่า x ยกกะลัง n มัน overflow ไปหรือยัง ถ้ามัน overflow แล้ว ก้อจะหยุด แล้วคืนคำตอบ ของรอบก่อนหน้านี้ออกไปครับ จริงๆ ลืมไปว่า น่าจะเช็ค n! ด้วยเนาะ ว่ามัน overflow หรือเปล่า (ไม่รู้ว่าอะไรจะ overflow) ก่อน

    สู้ๆ คับ Big Smile มีโจทย์มาให้ช่วยกันทำอีก ก้อช่วยมาโพสไว้บ้างนะคับ ลับสมองๆ

  • 07-28-2008 15:54 In reply to

    • soang
    • Top 10 Contributor
    • Joined on 06-30-2008
    • Posts 23

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    อ๋อเข้าใจแล้วครับ แค่เพิ่ม

    if ((power % 2) != 0) เอาเฉพาะเลขคี่

    ใน while loop ก็จบแล้ว คิดผิดไปเองที่เพิ่ม for loop

    ขอบคุณมากนะคร้าบ ส่วนโจทย์นี่มีคนเค้าฝากผมมาคิดอีกทีอ่ะครับ

    ถ้ามีปัญหาอีกแล้วจะมารบกวนต่อนะคร้าบ Big Smile

    // เพิ่งสอบเสจเลยมาตอบช้า Cool

  • 07-29-2008 15:18 In reply to

    Re: มีโจทย์คณิต ใช้C#เขียน มาให้คิดปวดหัวเล่นๆครับ

    ยินดีด้วยครับที่ทำได้แล้ว Smile

Page 1 of 1 (8 items)