練習題(一)

假設P是某個整數Q的完全平方數( P=Q^2)。
寫一個函式:

       int solution(int A, int B)

給定兩個整數A和B,然後B>=A,然後回傳在A和B區間內所有的完全平方數個數(包含A和B)。

例如: A=3 B=26,然後我們應該要回傳4,因為在3到26中間有4個完全平方數。
4=2^2, 9=3^2, 16=4^2, 25=5^2.

本文以C#實作執行。


 

完整程式碼如下:

using System;

namespace 練習題一
{
    class Program
    {

        public static double sqrt(int x)
        {
            double small = 0.000000001;
            double low, high;

            if (x < 0) return -1;

            if (x < 1)
            {
                low = 1; high = x;
            }
            else
            {
                low = 1;
                high = x;
            }

            while (high - low > small)
            {
                double mid = (low + high) / 2;
                if (mid * mid > x)
                {
                    high = mid;
                }
                else
                {
                    low = mid;
                }
            }

            return low;
        }

        public static int solution(int A, int B)
        {
            if ((int)(sqrt(A + 1)) > (int)(sqrt(A)) && (int)(sqrt(B + 1)) <= (int)(sqrt(B))) //處理下限為平方數 上限不為平方數
                return (int)sqrt(B) - (int)(sqrt(A - 1));
            else if ((int)(sqrt(B + 1)) > (int)(sqrt(B)) && (int)(sqrt(A + 1)) <= (int)(sqrt(A))) //處理上限為平方數 下限不為平方數
                return (int)sqrt(B - 1) - (int)(sqrt(A)) + 1;
            else if ((int)(sqrt(A + 1)) > (int)(sqrt(A)) && (int)(sqrt(B + 1)) > (int)(sqrt(B))) //處理上限下限皆為平方數
                return (int)sqrt(B - 1) - (int)(sqrt(A-1)) + 1;
            else //處理 上限下限皆不為平方數
                return (int)sqrt(B) - (int)(sqrt(A));
        }

        static void Main(string[] args)
        {

            Console.Write("請輸入區間的下限:");
            int small = int.Parse(Console.ReadLine());
            Console.Write("請輸入區間的上限:");
            int large = int.Parse(Console.ReadLine());

            Console.Write("["+small+".."+large+"]"+"="+ solution(small, large));

            Console.ReadKey();
        }
    }
}

執行結果如下:

下限為平方數,上限不為平方數
4,9,16,25,36,49,64,81

下限不為平方數,上限為平方數
9,16,25,36,49,64,81,100

上限下限皆為平方數
4,9,16,25,36,49,64,81,100

上限下限皆不為平方數
4,9,16,25,36,49,64,81,100

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace