• TDD实践:非负整数转整型数组方法(C#)


    1、引言
    这是我碰到一道面试题,当时时间紧我用的字符串分隔实现的,其具体要求为:
    将一非负整数转化为int[],如输入1234得到int[4]{ 1, 2, 3, 4 }。
    今晚有兴致运用TDD方法做了个不转字符串的版本,主是依靠浮点数转为整数时丢失小数位值这一特性实现的。
    *注:代码编写过程中单元测试与实现代码是相互交替的,并不像下面看到的分隔得那么明显。

    2、单元测试:
        [TestFixture]
        
    public class IntToArrayHelperTests : IntToArrayHelper
        {
            [Test]
            
    public void TestGetNumberAt()
            {
                Assert.AreEqual(
    0, GetNumberAt(01));
                Assert.AreEqual(
    1, GetNumberAt(11));
                Assert.AreEqual(
    1, GetNumberAt(211));
                Assert.AreEqual(
    1, GetNumberAt(100011));

                Assert.AreEqual(
    2, GetNumberAt(212));
                Assert.AreEqual(
    1, GetNumberAt(876543211));
                Assert.AreEqual(
    2, GetNumberAt(876543212));
                Assert.AreEqual(
    7, GetNumberAt(876543217));
                Assert.AreEqual(
    8, GetNumberAt(876543218));
            }

            [Test]
            
    public void TestGetDigitCount()
            {
                Assert.AreEqual(
    1, GetDigitCount(0));
                Assert.AreEqual(1, GetDigitCount(1));
                Assert.AreEqual(1, GetDigitCount(9));
                Assert.AreEqual(2, GetDigitCount(10));
                Assert.AreEqual(10, GetDigitCount(Int32.MaxValue));
            }

            [Test]
            
    public void TestConvert()
            {
                
    int[] a = new int[1] { 0 };
                Assert.AreEqual(a, Convert(
    0));

                
    int[] b = new int[1] { 1 };
                Assert.AreEqual(b, Convert(
    1));

                
    int[] c = new int[10] { 1234567890 };
                Assert.AreEqual(c, Convert(
    1234567890));

                
    int[] d = new int[9] { 987654321 };
                Assert.AreEqual(d, Convert(
    987654321));

                
    int[] max = new int[10] { 2147483647 };
                Assert.AreEqual(max, Convert(Int32.MaxValue));
            }

            [Test]       
            [ExpectedException(typeof(ArgumentOutOfRangeException))]
            
    public void TestConvertWithNegative()
            {
                Convert(
    -1);
            }
        }

    3、实现代码:
        public class IntToArrayHelper
        {
            
    protected int GetNumberAt(int value, int digit)
            {
                
    int contrastNumber = (int)Math.Pow(10, digit);
                
    int digitCutter = (int)Math.Pow(10, digit - 1);
                
    return (value - value / contrastNumber * contrastNumber) / digitCutter;
            }

            
    protected int GetDigitCount(int value)
            {            
                
    if (value == 0)
                    
    return 1;

                
    return (int)Math.Log10(value) + 1;
            }

            
    public int[] Convert(int value)
            {
                
    if (value < 0)
                    
    throw new ArgumentOutOfRangeException("value""Not less than zero.");            

                
    int digitCount = GetDigitCount(value);
                
    int[] result = new int[digitCount];

                
    for (int i = 0; i < digitCount; ++i)
                {
                    
    int index = digitCount - i - 1;
                    result[index] 
    = GetNumberAt(value, i + 1);
                }

                
    return result;
            }
        }


  • 相关阅读:
    [转载]辗转相除法
    [转载]自由不是什么
    [翻译]与比尔·盖茨面对面
    [翻译]AJAX XMLHttpRequest对象 详解
    [转载]Win32应用程序中进程间通信方法分析与比较
    C# 中的类型转换
    Log4Net
    抽象类和接口
    有用的自定义pagecounter控件
    单点登陆单web应用的单点登陆
  • 原文地址:https://www.cnblogs.com/SamZhang/p/836974.html
Copyright © 2020-2023  润新知