完全平方数的几种判定方法与算法用时

完美平方数定义

如果一个正整数 a 是某一个整数 b 的平方,那么这个正整数 a 叫做完全平方数。零也可称为完全平方数。
完全平方数的性质如下:

1、平方数的个位数字只能是 0, 1,4,5,6,9 。

2、任何偶数的平方一定能被 4 整除;任何奇数的平方被 4(或 8)除余 1,即被4 除余 2 或 3 的数一定不是完全平方数。

3、完全平方数的个位数字是奇数时,其十位上的数字必为偶数。完全平方数的个位数字是 6 时,其十位数字必为奇数。

4、凡个位数字是 5 但末两位数字不是 25 的自然数不是完全平方数;末尾只有奇数个 0 的自然数不是完全平方数;个位数字是 1,4,9 而十位数字为奇数的自然数不是完全平方数。

5、除 1 外,一个完全平方数分解质因数后,各个质因数的指数都是偶数,如果一个数质分解后, 各个指数都为偶数, 那么它肯定是个平方数。 完全平方数的所有因数的总个数是奇数个。因数个数为奇数的自然数一定是完全平方数。

6、如果 a 、b 是平方数, a=bc ,那么 c 也是完全平方数。

7、两个连续自然数的乘积一定不是平方数,两个连续自然数的平方数之间不再有平方数。

8、如果十位数字是奇数,则它的个位数字一定是6;反之也成立。

测试几种方法的用时

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

namespace PerfectSquareDemo
{
    class Program
    {
        const int maxNumber = 4096;
        static void Main(string[] args)
        {
            Console.SetWindowSize(140, 20);
            Console.WriteLine("小明今年的年龄减去10是个完全平方数,加上10也是个完全平方数,问小明今年的年龄");
            List<int> list = GetPerfectSquareList(1, 100);
            for (int i = 0; i < 100; i++)
            {
                if (list.Contains(i - 10) && list.Contains(i + 10))
                {
                    Console.WriteLine($"从完全平方数的集合中查找:小明年龄【{i}】");
                }
                if (IsPerfectSquareNumber(i - 10) && IsPerfectSquareNumber(i + 10))
                {
                    Console.WriteLine($"根据完全平方数定义查找:小明年龄【{i}】");
                }
            }
            Console.WriteLine("----测试几个算法的用时----");
            Task taskPredicate = Task.Run(() => { AlgorithmTimespan(IsPerfectSquareNumber, nameof(IsPerfectSquareNumber)); });
            Task taskPredicate1 = Task.Run(() => { AlgorithmTimespan(IsPerfectSquareNumber1, nameof(IsPerfectSquareNumber1)); });
            Task taskPredicate2 = Task.Run(() => { AlgorithmTimespan(IsPerfectSquareNumber2, nameof(IsPerfectSquareNumber2)); });
            Task.WaitAll(taskPredicate, taskPredicate1, taskPredicate2);
            Console.ReadLine();
        }

        /// <summary>
        /// 获取完美平方数的集合
        /// </summary>
        /// <param name="fromIndex"></param>
        /// <param name="toIndex"></param>
        /// <returns></returns>
        static List<int> GetPerfectSquareList(int fromIndex, int toIndex)
        {
            List<int> list = new List<int>();
            for (int i = fromIndex; i <= toIndex; i++)
            {
                list.Add(i * i);
            }
            return list;
        }

        /// <summary>
        /// 算法用时
        /// </summary>
        /// <param name="PredicateMethod">判定是否是完美平方数的方法</param>
        /// <param name="methodName"></param>
        static void AlgorithmTimespan(Func<int, bool> PredicateMethod, string methodName)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();
            string path = AppDomain.CurrentDomain.BaseDirectory + methodName + ".log";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            for (int number = 1; number <= maxNumber; number++)
            {
                bool isPerfectSquare = PredicateMethod(number);
                File.AppendAllText(path, $"【{number}】是完美平方数:【{isPerfectSquare}】{Environment.NewLine}", Encoding.UTF8);
            }
            Console.WriteLine($"【{methodName.PadRight(22)}】,对【{maxNumber}】个数字进行完美平方数判定并打印出来,用时【{stopwatch.Elapsed.TotalMilliseconds}】ms");
        }


        /// <summary>
        /// 判断一个数是否是完全平方数
        /// 平方根取整法
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsPerfectSquareNumber(int number)
        {
            double x = Math.Sqrt(number);
            int truncate = (int)x;
            return truncate * truncate == number;
        }

        /// <summary>
        /// 判断一个数是否是完全平方数
        /// 存在一个数的平方等于当前数
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsPerfectSquareNumber1(int number)
        {
            for (int i = 1; i <= number; i++)
            {
                if (i * i == number)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 判断一个数是否是完全平方数
        /// 取平方根,然后取整,如果能整除
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsPerfectSquareNumber2(int number)
        {
            int i = (int)Math.Sqrt(number);
            return number % i == 0;
        }
    }
}

运行结果:

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值