2015年3月26日 星期四

[2015][Homework]Team02 - Hw02

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hw2
{
    class Program
    {
        static void Main(string[] args)
        {
            int sele;
            while (true)
            {
                Console.WriteLine("請輸入1或2執行第一題或第二題");
                Console.WriteLine("若要結束程式請輸入其他數字");
                sele = int.Parse(Console.ReadLine());
                switch (sele)
                {
                    case 1:
                        int kGcd;
                        Console.WriteLine("若 a, b 為整數, 求ax+by=c的整數解。");
                        Console.WriteLine("請輸入一個整數a");
                        int a = int.Parse(Console.ReadLine());
                        Console.WriteLine("請輸入一個整數b");
                        int b = int.Parse(Console.ReadLine());
                        Console.WriteLine("請輸入一個整數c");
                        int c = int.Parse(Console.ReadLine());

                        //演算步驟一     計算 a, b 的最大公因數 
                        int aCopy = a;
                        int bCopy = b;
                        int temp;
                        if (a > b)
                        {
                            while(aCopy % bCopy != 0)
                            {
                                temp = aCopy % bCopy;
                                aCopy = bCopy;
                                bCopy = temp;
                            }
                            kGcd = bCopy;

                        }
                        else
                        {
                            while(bCopy % aCopy != 0)
                            {
                                temp = bCopy % aCopy;
                                bCopy = aCopy;
                                aCopy = temp;
                            }
                            kGcd = aCopy;
                        }
                        
                        Console.WriteLine("最大公因數={0}",kGcd);
                        //演算步驟二     設(a, b) = k, 若 c 不為 k 的倍數, 則無解。 
                        if (c % kGcd != 0)
                        {
                            Console.WriteLine("無解");
                            Console.ReadLine();
                            Console.Clear();
                            break;
                        }
                        //演算步驟三     若 c = kc’
                        a /= kGcd;
                        b /= kGcd;
                        c /= kGcd;
                        //演算步驟四     求特殊解
                        int x = 0;
                        int y = 0;
                        for (y = 0; y <= a; y++)
                        {
                            if ((c - b * y) % a == 0)
                            {
                                x = (c - b * y) / a;
                                break;
                            }
                        }
                        //演算步驟五     通解
                        int t;
                        for (t = 0; t < 10; t++)
                        {
                            Console.WriteLine("x={0,3},y={1,3}", x, y);
                            x += b;
                            y -= a;
                        }
                        Console.ReadKey();
                        Console.Clear();
                        break;
                    case 2:
                        int aContainer = 3;
                        int bContainer = 5;
                        int aWater = 0;
                        int bWater = 0;
                        int step = 0;
                        Console.WriteLine("一開始,A桶有水{0}公升,B桶有水{1}公升\n", aWater, bWater);
                        while (bWater != 4)
                        {
                            step++;
                            if (bWater == 0)
                            {
                                bWater = bContainer;
                                Console.WriteLine("step{0}:把B桶裝滿水\n此時,A桶有水{1}公升,B桶有水{2}公升\n", step, aWater, bWater);

                            }
                            else if (aWater >= 3)
                            {
                                aWater = 0;
                                Console.WriteLine("step{0}:A桶水滿,把A桶的水全部倒掉\n此時,A桶有水{1}公升,B桶有水{2}公升\n", step, aWater, bWater);
                            }
                            else if (aWater + bWater >= aContainer)
                            {
                                bWater = aWater + bWater - aContainer;
                                aWater = aContainer;
                                Console.WriteLine("step{0}:將B桶的水倒滿A桶\n此時,A桶有水{1}公升,B桶有水{2}公升\n", step, aWater, bWater);
                            }
                            else if (aWater + bWater != 4)
                            {
                                aWater = aWater + bWater;
                                bWater = 0;
                                Console.WriteLine("step{0}:將B桶的水倒滿A桶\n此時,A桶有水{1}公升,B桶有水{2}公升\n", step, aWater, bWater);
                            }
                            else//bWater+aWater=4
                            {
                                bWater = aWater + bWater;
                                aWater = 0;
                                Console.WriteLine("step{0}:將A桶的水倒回B桶\n此時,A桶有水{1}公升,B桶有水{2}公升\n", step, aWater, bWater);
                            }
                        }
                        Console.WriteLine("最後,A桶有水{0}公升,B桶有水{1}公升\n", aWater, bWater);
                        Console.WriteLine("B桶有水{0}公升放在啟動開關上,解除炸彈", bWater);
                        Console.ReadLine();
                        Console.Clear();
                        break;
                    default:
                        return;
                }
            }
        }
    }
}

3 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. 應將題目一般化
    1. A, B 兩容器若是任意值
    2. 目標水量也是任意值

    回覆刪除
  3. 變數進行以下修正會比較容易閱讀
    kGcd ==> gcd
    aContainer ==> containerA
    aWater ==> currentCapacityA

    回覆刪除