`

数组的进一步使用

阅读更多
数组是数据结构中最基本的结构形式,它是一种顺序式的结构,存储的是同一类型的数据。每个数组元素都拥有下标(index)和元素值(value),下标方便存取数据,而元素值就是被存储的数据。

    数组使用静态的内存空间配置方式。这也是数组的一个很不方便的地方,在经常需要重新分配数据的存储空间的应用上,往往使用数组就显得非常影响效率;而且,对数组的添加、删除、排序的操作也是比较麻烦以及低效的。

    在.net里提供了一种ArrayList的结构,在过去很长一段时间里,我经常会在需要使用集合对象的时候想到它(主要是受早先starter kits的影响),但是ArrayList还是由数组构成的,虽然它在添加元素,删除元素等方面比数组方便了,但是从效率上讲,毕竟它还是基于数组的结构。所谓换汤不换药。

    其实,今天我不是想来说数组怎么怎么不好的,而是发挥数组的一些优点,来作一些原本相对复杂的事情,比如,当我们需要计算一个阶乘,而计算结果又超出了我们的数据类型所能存储的范围。

目的:
    设计一个可以容纳40位数字的求n!的程序。

思路:
    首先,明确我们要解决的问题,在.net的数据结构中,整形数据类型的最大范围是-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(0 到 18,446,744,073,709,551,615),而当我们计算的这个结果需要有40位,就没有适合的数据结构来存储这个数据。这个时候我们可以借助数组,预先声明一个大小为40的数组,负责存储每一个位数上的整数。
    接下来,就是程序设计的思路,聚个例子作为示范,假如我们要计算5!:

第一步:1!
数组内容

4

3

2

1

0

0

0

1


第二步:2!
数组内容

4

3

2

1

0

0

0

2*1


第三步:3!
数组内容

4

3

2

1

0

0

0

2*3


第二步:4!
数组内容

4

3

2

1

0

0

0

6*4


第二步:2!
数组内容

4

3

2

1

0

0

2*5

4*5


    很明显,我们需要做的就是对数组的每一个元素进行累积,超过10以后向前进一位。

程序源码:

 

  1using System;
  2
  3namespace DsPractice.Array.Factorial
  4{
  5    /**//// <summary>
  6    /// 利用数组的方式求解指定数字的阶乘。
  7    /// </summary>
  8    class Demo
  9    {
 10        /**//// <summary>
 11        /// 应用程序的主入口点。
 12        /// </summary>
 13        [STAThread]
 14        static void Main(string[] args)
 15        {
 16            DoCalculate();
 17        }

 18
 19        public static void DoCalculate()
 20        {
 21            // 选择算法
 22            int type = new NumberReader("Please choose an algorithm: \r\n1. Type A;\r\n2. Type B.", 12).GetNumber();
 23            
 24            // 获取要计算的数字
 25            int number = new NumberReader("Please input a number to calculate factorial:").GetNumber();
 26
 27            // 获得存放计算结果的数组的长度
 28            int length = new NumberReader("Please input a number of array digit:").GetNumber();
 29
 30            // 创建一个阶乘计算对象
 31            Factorial factorial = new Factorial(number, length);
 32
 33            // 计算并显示结果
 34            factorial.ShowResult(type);
 35
 36            // 提示用户继续或结束
 37            int res = new NumberReader("Do you wannar try again?\r\n1. Yes;\r\n2. No.", 12).GetNumber();
 38
 39            // 如果继续执行,则返回重新调用
 40            if (res == 1)
 41            {
 42                DoCalculate();
 43            }

 44        }

 45
 46        public class NumberReader
 47        {
 48            private int _min = -999;
 49
 50            private int _max = 999;
 51
 52            private string _strNumber;
 53
 54            public NumberReader(string todo)
 55            {
 56                // 提示输入数字
 57                Console.WriteLine(todo);
 58                // 获取数字字符串
 59                _strNumber = Console.ReadLine();
 60            }

 61
 62            public NumberReader(string todo, int min, int max) : this(todo)
 63            {
 64                this._max = max;
 65                this._min = min;
 66            }

 67
 68            public int GetNumber()
 69            {
 70                int number = 0;
 71
 72                try
 73                {
 74                    number = int.Parse(this._strNumber);
 75
 76                    if (number > this._max || number < this._min)
 77                    {
 78                        throw new Exception();
 79                    }

 80                }

 81                catch (System.FormatException formatEx)
 82                {
 83                    number = new NumberReader("Input format error! Please input again: ").GetNumber();
 84                }

 85                catch (System.Exception ex)
 86                {
 87                    number = new NumberReader("Input error! Please input again: ").GetNumber();
 88                }

 89
 90                return number;
 91            }

 92        }

 93
 94        public class Factorial
 95        {
 96            // 要计算的数字
 97            private int _number = 0;
 98
 99            // 结果的位数
100            private int _digit = 1;
101
102            // 存放结果的数组
103            private int[] _data = null;
104
105            // 复杂度标记
106            private int _complex = 0;
107
108            public Factorial(int number) : this(num
分享到:
评论

相关推荐

    Java程序设计基础:一维数组应用数组作为方法形参.pptx

    理解数组作为方法形参,方法体内数组的使用 复习:方法定义的语法 数组作为方法的形参 修饰符 返回值类型 方法名(参数列表){ //方法体 } 基本类型 引用类型 基本类型 引用类型 任务:编写方法实现下列一维数组的...

    字符串转基64字节数组

    前台使用二进制字节数组将图片数据传递给对象的 byte[] 属性,后台向前台传送图片数据时,用的是基64字符串。如果前台向后台传送的不是基64字节数组,那么前台接收后台的图片数据时,就不能还原成图片了,需要做...

    数据结构实验 数组和广义表

    (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点; (2)掌握线数组和广义表储存结构的定义及C语言实现; (3)掌握数组和广义表的各种基本操作; (4)学会利用数组和广义表的基本知识解决实际问题。 三、...

    用C语言创建动态数组

    本文讲述了如何用C语言也能创建动态数组的技巧,通过代码实例来演示分析,让你进一步了解数组的动态创建技巧与代码的艺术。

    Java程序设计基础:二维数组基本操作.pptx

    进一步熟记对二维数组元素 的访问; 2 掌握以矩阵形式输出二维数 组元素; 3 掌握求二维数组所有元素和 的操作; 学习目标 4 掌握求二维数组正对角线元 素和的操作; 55 了解求二维数组最大值的元 素及下标的操作; ...

    使用foreach循环遍历数组的其它例子(附详细步骤).txt

    这个代码的作用是遍历数组并输出每个元素的值。具体来说,它定义了一个包含三个水果...在实际开发中,我们可以使用foreach循环来遍历从数据库中查询出来的数据、用户提交的表单数据等,以便进行进一步的处理和分析。

    使用foreach循环遍历数组的用法例子(附详细步骤).txt

    这个代码的作用是遍历数组并输出每个元素的值。具体来说,它定义了一个包含三个水果...在实际开发中,我们可以使用foreach循环来遍历从数据库中查询出来的数据、用户提交的表单数据等,以便进行进一步的处理和分析。

    二维数组全排列代码C++版

    二维数组全排列生成方法,采用递归方法实现,10*24大概用时30min,有待进一步改进

    matlab数组输入代码(包含详细讲解)

    第二步:如果我们想进一步确认或者直观看到是否成功创建数组的话,我们可以在工作空间看到运行结果数组名称及值,我们双击即可查看创建的数组详细情况,如下图所示。 第三步:上面创建的是一维数组,接下来教大家...

    c语言输入字符串数组四组输入字符串数组

    三、我们还可以在输入前先为每个字符串设定一个默认值,如果用户没有输入新的值,那么就使用默认值。这是一种防止数组中的字符串留空的方法。我们也可以添加一些额外的错误检查,比如确保数组的每个元素都已填满。...

    2024年Java数组完全解析(干货满满).zip

    通过阅读,你将能够理解数组的概念,学会如何在Java中创建和操作数组,以及如何在实际编程中使用数组。目标是帮助初学者建立对Java数组的基本理解,为后续的编程学习和实践打下坚实的基础。 【其他说明】 文章采用...

    java数组矩阵乘法

    java 矩阵乘法 通俗易懂非常适合初学者学习和交流,对java进一步了解

    array size (数组大小测量)2.zip_数组大小测量

    测量数组的大小,知道数组中有多少元素,就可进一步的编写程序

    C语言柔性数组实例详解

    本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值。分享给大家供大家参考。具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组。但结构中的...

    Matlab数组矩阵在实际中的运用,对开发小游戏的作用.pdf

    例如,我们可以使用数组来存储游戏中各种物体的属性和状态信息,如位置、速度、血量等,同时还可以使用数组来实现游戏中的各种算法,如路径规划、AI决策等。 最后,Matlab还可以通过与其他游戏引擎和框架进行集成,...

    c语言实验报告

    (4)掌握与数组有关的常用排序算法,进一步理解模块化程序设计的方法。 (5)掌握字符、字符串的输入/输出方法。 (6)掌握字符数组的使用。 (7)学会使用字符串的指针和指向字符串的指针变量。

    JavaScript数组全解密

    特别是JavaScript,它天生的灵活性,又进一步发挥了数组的特长,丰富了数组的使用场景。可以豪不夸张地说,不深入地了解数组,不足以写JavaScript。截止ES7规范,数组共包含33个标准的API方法和一个非标准的API方法...

    AS3.0 用数组实现雪花飘落

    用数组实现雪花飘落,可调节雪花大小,透明度,运动速度,进一步理解掌握AS中数组的运用

    c++程序设计实验指导:构造函数及对象数组

    c++程序设计实验指导 1. 学会各种形式的构造函数的写法 2. 学会使用对象数组 3. 进一步熟悉用面向对象的思维解决问题

Global site tag (gtag.js) - Google Analytics