2015年3月26日 星期四

[2015][Homework]Team01 - Hw03

[2015][Homework]Team04 - Hw04

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

namespace JugPuzzle
{
    class Program
    {
        static void Main(string[] args)
        {
            int capacityA;
            int capacityB;
            int gcd;
            int target;

            Console.WriteLine("Jug Puzzle!");
            Console.WriteLine("Please input cylinderA capacity");      //key in
            capacityA = int.Parse(Console.ReadLine());
            Console.WriteLine("Please input cylinderB capacity");
            capacityB = int.Parse(Console.ReadLine());
            Console.WriteLine("Please input target capacity");
            target = int.Parse(Console.ReadLine());
            Console.WriteLine("*******************************************************");

            gcd = Program.gcd(capacityA, capacityB);      //find gcd

            if (target % gcd == 0)      //Is solvable?
            {
                if (capacityA + capacityB >= target)
                {
                    Program.jugPuzzle(capacityA, capacityB, target);
                }
                else
                {
                    Console.WriteLine("Not solvable!");
                }
            }
            else
            {
                Console.WriteLine("Not solvable!");
            }
            Console.Read();
        }

        static int gcd(int m, int n)      //最大公因數
        {
            int temp = 0;
            while (n != 0)
            {
                temp = m % n;
                m = n;
                n = temp;
            }
            return m;
        }

        static void jugPuzzle(int capacityA, int capacityB, int target)
        {
            int tem;
            int waterInA = 0;
            int waterInB = 0;

            if (capacityA > capacityB)      //if capacityA>B, exchange each other
            {
                tem = capacityA;
                capacityA = capacityB;
                capacityB = tem;
                Console.WriteLine("Capavity of B is smaller then capacity of A");
                Console.WriteLine("Exchange: capavity of A is {0}(smaller), and capacity of B is {1}(larger)", capacityA, capacityB);
            }
            else if (capacityA < capacityB)
            {
                Console.WriteLine("Capavity of A is smaller than capacity of B");
            }
            else
            {
                Console.WriteLine("Capavity of A and capacity of B are same");
            }
            Console.WriteLine("*******************************************************");

            while (true)
            {
                if (capacityA + capacityB == target)      //if capacity A + capacity B = target
                {
                    waterInA = capacityA;
                    waterInB = capacityB;
                    Console.WriteLine("Fill in cylinderA and cylinderB");
                    Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
                    if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
                    {
                        break;
                    }
                }
                if (waterInA == 0)      //if A is empty
                {
                    waterInA = capacityA;
                    Console.WriteLine("Fill in cylinderA");
                    Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
                    if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
                    {
                        break;
                    }
                }
                if (capacityB - waterInB > capacityA)      //if A pour into B
                {
                    waterInB = waterInB + waterInA;
                    waterInA = 0;
                    Console.WriteLine("CylinderA pour into cylinderB");
                    Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
                    if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
                    {
                        break;
                    }
                }
                else
                {
                    waterInA = waterInA - (capacityB - waterInB);
                    waterInB = capacityB;
                    Console.WriteLine("CylinderA pour into cylinderB");
                    Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
                    if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
                    {
                        break;
                    }
                }
                if (waterInB == capacityB)      //if B is full, pour out
                {
                    waterInB = 0;
                    waterInB = waterInA;
                    waterInA = 0;
                    Console.WriteLine("CylinderB is full, pour out");
                    Console.WriteLine("And cylinderA pour into cylinderB");
                    Console.WriteLine("cylinderA:({0}) cylinderB:({1})", waterInA, waterInB);
                    if (waterInA == target || waterInB == target || (waterInA + waterInB) == target)
                    {
                        break;
                    }
                }
            }
            Console.WriteLine("Done!");
        }
    }
}

[2015][Homework]Team03 - Hw01 (Revised)

namespace HW1
{
    class Program
    {
        static void printArmstrongNumber()
        {
            int first, second, third,num;
            for (int i = 100; i < 1000; i++)
            {
                first = i / 100;
                second = i / 10 % 10;
                third = i % 10;
                num = first * first * first + second * second * second + third * third * third;
                if (i == num)
                    Console.WriteLine(i);
            }
        }
        static bool determineLeapYear(int year)//閏年 回傳True
        {
            if (((year % 400) == 0) || ((year % 4 == 0) && (year % 100 != 0))) 
                return true;
            else return false;
        }
        static int countDayOfMonth(int year, int month)
        { 
            if (month != 2)
            {
                int big = 1;
                if (month <= 7)
                {
                    if (month % 2 == 0) big = 0;
                }
                else
                    if (month % 2 == 1) big = 0;
                if (big == 1) return 31;
                else return 30;
            }
            else                    //2月
                if (Program.determineLeapYear(year)) return 29;
                else return 28;
        }//回傳天數
        static void findWeek(int year, int month, int day)
        {
            int Difference;
            Difference = countDayBetweenOtherDay(1, 1, 1, year, month, day);
           // Difference++;
            if (Difference == -1) Console.WriteLine("星期1");
            Difference = Difference % 7;
            if (Difference == 0)
                Console.WriteLine("星期2");
            if (Difference == 1)
                Console.WriteLine("星期3");
            if (Difference == 2)
                Console.WriteLine("星期4");
            if (Difference == 3)
                Console.WriteLine("星期5");
            if (Difference == 4)
                Console.WriteLine("星期6");
            if (Difference == 5)
                Console.WriteLine("星期天");
            if (Difference == 6)
                Console.WriteLine("星期1");
        }
        static bool determineDay(int year, int month, int day)//有效日期判斷
        {
            if ((month <= 12) && (month >= 1) && ((day <= countDayOfMonth(year, month)) && (day > 0))) return true;
            else return false;
        }
        static int countDayBetweenOtherDay(int year, int month, int day, int year2, int month2, int day2)//回傳 兩日相差天數
        {
            int dayOffset = 0;//offset
            for (int i = year2; i > year; i--)//年換算
            {
                if (determineLeapYear(i - 1))
                    dayOffset += 366;
                else dayOffset += 365;
            }
            for (int i = month2; i > 1; i--)//月換算(轉成1/1)
                    dayOffset += countDayOfMonth(year2, i - 1);
                for (int i = month; i > 1; i--)//月換算(轉成1/1)
                    dayOffset -= countDayOfMonth(year, i - 1);
                    return day2 + dayOffset -day - 1;
        }
 
        static void Main(string[] args)
        {
            string inputTemp;//input的暫存器
            int choose;
            int year;
            int month;
            int day;
            int year2;
            int month2;
            int day2;

            while(true)
            {
            #region input
            Console.WriteLine("請輸入要測哪一題:");
            inputTemp=Console.ReadLine();
            choose = Convert.ToInt32(inputTemp);
            #endregion
            #region test1
            if (choose == 1)
            {
                Console.WriteLine("請寫出可以列印出所有三位數(100~999)之『阿姆斯壯數』");
                printArmstrongNumber();
            }
            #endregion
            #region test2
            else if (choose == 2)
            {
                Console.WriteLine("輸入西元年份,讓我幫你算算是不是閏年:");
                inputTemp = Console.ReadLine();
                year = Convert.ToInt32(inputTemp);
                if (determineLeapYear(year)) Console.WriteLine("是閏年!");
                else Console.WriteLine("是平年!");
            }
            #endregion
            #region test3
            else if (choose == 3)
            {
                Console.WriteLine("輸入西元年份及月份,讓我幫你算算該月有幾天:");
                Console.WriteLine("請先輸入西元年份:");
                inputTemp = Console.ReadLine();
                year = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入月份:");
                inputTemp = Console.ReadLine();
                month = Convert.ToInt32(inputTemp);
                Console.WriteLine(countDayOfMonth(year, month));
            }
            #endregion
            #region test4
            else if (choose == 4)
            {
                Console.WriteLine("輸入西元年份及月份和日期,讓我幫你算算是星期幾:");
                Console.WriteLine("請先輸入西元年份:");
                inputTemp = Console.ReadLine();
               year = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入月份:");
                inputTemp = Console.ReadLine();
                month = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入日期:");
                inputTemp = Console.ReadLine();
               day = Convert.ToInt32(inputTemp);
               findWeek(year, month, day);
            }
            #endregion
            #region test5
            else if (choose == 5)
            {
                Console.WriteLine("輸入西元年份及月份和日期,讓我幫你算算是不是合法日期:");
                Console.WriteLine("請先輸入西元年份:");
                inputTemp = Console.ReadLine();
               year = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入月份:");
                inputTemp = Console.ReadLine();
                month = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入日期:");
                inputTemp = Console.ReadLine();
               day = Convert.ToInt32(inputTemp);
                if (determineDay(year, month,day)) Console.WriteLine("合法!");
                else
                    Console.WriteLine("不合法!");
            }
            #endregion
            #region test6
            else if (choose == 6)
            {
                Console.WriteLine("輸入兩個西元年份及月份和日期,讓我幫你算算總共差幾天:");
                Console.WriteLine("請先輸入(起始)西元年份:");
                inputTemp = Console.ReadLine();
               year = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入(起始)月份:");
                inputTemp = Console.ReadLine();
                month = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入(起始)日期:");
                inputTemp = Console.ReadLine();
               day = Convert.ToInt32(inputTemp);
                Console.WriteLine("請先輸入(結束)西元年份:");
                inputTemp = Console.ReadLine();
                year2 = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入(結束)月份:");
                inputTemp = Console.ReadLine();
                month2 = Convert.ToInt32(inputTemp);
                Console.WriteLine("請輸入(結束)日期:");
                inputTemp = Console.ReadLine();
                day2 = Convert.ToInt32(inputTemp);
                Console.WriteLine(countDayBetweenOtherDay(year, month, day, year2, month2, day2));
            }
            #endregion
            else Console.WriteLine("不合法的輸入= =");
 
        }
        }
    }
}