当前位置: 首页 > 编程日记 > 正文

数组的进一步使用

数组是数据结构中最基本的结构形式,它是一种顺序式的结构,存储的是同一类型的数据。每个数组元素都拥有下标(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(number, 40)
109            {}
110
111            public Factorial(int number, int digit)
112            {
113                this._number = number;
114                this._data = new int[digit];
115                this._data[0= 1;
116            }

117
118            private void CalculateA()
119            {
120                try
121                {
122                    for (int i=1; i<=this._number; i++)
123                    {
124                        int digit;
125                        for (digit=this._data.GetLength(0); digit>0; digit--)
126                        {
127                            this._complex ++;
128                            this._data[digit-1= this._data[digit-1* i;
129                        
130                            if (this._data[digit-1>= 10)
131                            {                            
132                                for (int j=digit; j<this._data.GetLength(0); j++)
133                                {
134                                    this._complex ++;
135                                    this._data[j] += this._data[j-1/ 10;
136                                    
137                                    this._complex ++;
138                                    this._data[j-1= this._data[j-1% 10;
139                                }

140                            }

141                        }

142                    }

143                }

144                catch
145                {
146                    return;
147                }

148            }

149
150            private void CalculateB()
151            {
152                // 初始位数为个位,也就是1
153                try
154                {
155                    for (int i=1; i<=this._number; i++)
156                    {
157                        // 数组元素的运算
158                        for (int j=1; j<=this._digit; j++)
159                        {
160                            this._complex ++;
161                            this._data[j-1*= i;
162                        }

163                        // 从个位开始,根据每一位的数字判断是否需要进位
164                        for (int j=1; j<=this._digit; j++)
165                        {
166                            // 如果当前位大于等于10,则依次向前进一位
167                            if (this._data[j-1>= 10)
168                            {
169                                // 从当前位开始,根据每一位的数字进行进位
170                                for (int m=j; m<=this._digit; m++)
171                                {
172                                    if (this._data[this._digit-1>= 10)
173                                    {
174                                        this._complex ++;
175                                        this._digit++;
176                                    }

177
178                                    this._complex ++;
179                                    this._data[m] += this._data[m-1/ 10;
180
181                                    this._complex ++;
182                                    this._data[m-1= this._data[m-1% 10;
183                                }

184                            }

185                        }

186                    }

187                }

188                catch
189                {
190                    return;
191                }

192            }

193
194            public void ShowResult(int type)
195            {
196                Console.Write("Result is ");
197                switch(type)
198                {
199                    case 1:
200                        this.CalculateA();
201
202                        for (int i=this._data.GetLength(0)-1; i>=0; i--)
203                        {
204                            Console.Write(this._data[i].ToString());
205                        }

206
207                        break;
208                    default:
209                        this.CalculateB();
210
211                        for (int i=this._digit-1; i>=0; i--)
212                        {
213                            Console.Write(this._data[i].ToString());
214                        }

215
216                        break;
217                }

218                Console.WriteLine();
219                Console.WriteLine("Code complex is " + this._complex.ToString());
220            }

221        }

222    }

223}

224

以上源码提供了两种算法,各自的复杂度都可以很清楚的查看到,如果有兴趣的朋友可以再提供一些其他的更有效的算法。 

相关文章:

百度香港二次上市,12 岁开发者、AI 机器人同台敲响“芯片代码锣”

整理 | AI科技大本营&#xff08;ID:rgznai100&#xff09;今日&#xff0c;继 2005 年百度在纳斯达克上市后&#xff0c;百度在香港的第二次上市。上市首日开盘价254港元每股&#xff0c;截至发稿&#xff0c;为 252 港元每股&#xff0c;总市值约为 7129 亿港元。现场“敲锣人…

Linux启动流程(二)

//...根据grub内核映像所在路径,读取内核映像&#xff0c;并进行解压缩操作。并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备&#xff0c;完成Linux核心环境的建立1.start_kernel(init/main.c)中调用一系列初始化函数:(1) 在屏幕上打印出当前的内核版本信息…

写代码可能是成为软件工程师最容易的部分

当然&#xff0c;写代码是超级重要的&#xff0c;但是我认为它只是整个过程中的一小部分&#xff0c;且不一定是最难学的。 学习如何写代码要花些时间&#xff0c;但是只要有足够的训练&#xff08;每天写代码&#xff0c;坚持数年&#xff09;&#xff0c;你就能真正擅长它。 …

不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

2016 年&#xff0c;百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪。 2019 年 4 月&#xff0c;在 Wave Summit 深度学习开发者峰会上&#xff0c;首次发布了PaddlePaddle 的中文名“飞桨”&#xff0c;开始强调自己更适合中国开发者&#xff0c;以及更加专注于深度学…

基于Sql Server 2008的分布式数据库的实践(一)

原文 基于Sql Server 2008的分布式数据库的实践&#xff08;一&#xff09; 配置Sql Server 2008&#xff08;Win7&#xff09; 1.打开SQL server2012&#xff0c;使用windows身份登录 2.登录后&#xff0c;右键选择“属性”。左侧选择“安全性”&#xff0c;选中右侧的“SQL S…

HttpHand和HttpModule的详细解释,包括Asp.Net对Http请求的处理流程。

了解当用户对一个.aspx页面提出请求时&#xff0c;后台的Web服务器的动作流程。当对这个流程了解后&#xff0c;我们就会明白HttpHandler和HttpModule的作用了。 首先&#xff0c;来了解一下IIS系统。它是一个程序&#xff0c;负责对网站的内容进行管理&#xff0c;以及对客户的…

WebGL初探

目前&#xff0c;我们有很多方案可以快速的接触到 WebGL 并绘制复杂的图形&#xff0c;但最后发现我们忽视了很多细节性的东西。当然&#xff0c;这对初学 WebGL 是有必要的&#xff0c;它能迅速提起我们对 WebGL 的学习兴趣。当学习到更加深入的阶段时&#xff0c;我们更想了解…

Linux下用C语言最基本的程序开发与调试

1.建一个目录2.写代码&#xff0c;建一个hello.c文件代码&#xff1a;view plaincopy to clipboardprint?#include "stdio.h" main() { printf("Hello Linux.\n") } #include "stdio.h" main() { printf("Hello Linux.\n")…

全面升级!星环科技基础软件再升级,赋能数字中国建设

3月24日&#xff0c;星环科技举行2021线上发布会&#xff0c;支持10种主流数据模型的多模数据平台和数据云产品、实现AI建模的全生命周期管理人工智能等产品新版本齐齐亮相。 星环科技坚持核心技术自主原创&#xff0c;专注于大数据基础平台、分布式关系型数据库、数据开发与智…

脚本中echo显示内容带颜色显示

脚本中echo显示内容带颜色显示,echo显示带颜色&#xff0c;需要使用参数-e格式如下&#xff1a;echo -e "\033[字背景颜色&#xff1b;文字颜色m字符串\033[0m"例如&#xff1a;echo -e "\033[41;36m something here \033[0m"其中41的位置代表底色&#xf…

Java 8默认方法会破坏你的(用户的)代码

Java 8的默认方法试图尝试更进一步简化Java API。不幸的是&#xff0c;这一最近的语言扩展带来了一系列复杂的规则&#xff0c;但只有少部分Java开发者意识到这一点。这篇文章告诉你为什么引入默认方法会破坏你的&#xff08;用户的&#xff09;代码。 起初看来&#xff0c;默认…

JPA多对多关联

关于JPA多对多关系&#xff0c;这是使用学生与教师来表示。一个Student由多个Teacher教&#xff0c;同样一个Teacher也可以教多个学生。Student类如下&#xff1a; 1 package com.yichun.bean;2 3 import java.util.HashSet;4 import java.util.Set;5 6 import javax.persisten…

上市之后,青云存储平台 QingStor 也要“进军”云原生

作者 | 夕颜头图 | 下载于东方IC出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;3 月 16 日&#xff0c;北京青云科技股份有限公司&#xff08;以下简称“青云科技”&#xff09;登录科创板&#xff0c;昔日里频频出现在公众视野的云计算企业&#xff0c;终…

SQL Server 存储过程的分页方案比拼

建立表&#xff1a; CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI…

未来黑客入侵的不仅有电脑,还有人脑?

提到黑客入侵&#xff0c;我们能够知道的领域有很多&#xff0c;比如企业数据库、金融系统、个人信息、个人账户等。随着时代的变迁&#xff0c;人工智能、云计算、物联网等相继崛起&#xff0c;可能给黑客攻击的领域变得越发宽广。可是如果说黑客能攻击控制的不仅仅是电脑&…

不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法。最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令。这种方法也非常的简单&#xff0c;只需使用下面的SQL语句&#xff1a;EXEC master.dbo.xp_cmdshell dir c:/但是越来越…

谷歌低调了 5 年的 Fuchsia OS,终于有望面世了!

种种迹象表明&#xff0c;低调了多年的 Fuchsia OS 可能就要出首个开发者版本了&#xff01;整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;千呼万唤始出来&#xff0c;等待了五年&#xff0c;谷歌 Fuchsia OS 的首个开发者版本终于有望面世了&#…

chrom扩展开发-入门

2019独角兽企业重金招聘Python工程师标准>>> 先了解一下chrome的两种功能延伸方式&#xff1a; * 扩展&#xff08;Extension&#xff09; 1.指的是通过调用 Chrome 提供的 Chrome API 来扩展浏览器功能的一种组件&#xff0c;工作在浏览器层面&#xff0c;使用 HT…

你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施

对开发者来说&#xff0c;目前有一系列的机器学习模型可供选择。雷锋网(公众号&#xff1a;雷锋网)了解&#xff0c;可以用线性回归模型预测具体的数值&#xff0c;用逻辑回归模型对不同的运算结果进行归类&#xff0c;以及用神经网络模型处理非线性的问题等等。 不论哪一种&am…

释放CPU,算力经济下DPU芯片的发展机遇

当前承载算力的基础设施是各种规模的的数据中心&#xff0c;从几十个服务器节点的小规模企业级计算中心到数万个节点的巨型数据中心&#xff0c;通过云计算的模式对应用层客户提供存储、软件、计算平台等服务。这个生态直接承载了全球数十万亿美元规模的数字经济&#xff0c;而…

SQLserver安全设置攻略

日前SQL INJECTION的攻击测试愈演愈烈&#xff0c;很多大型的网站和论坛都相继被注入。这些网站一般使用的多为SQLSERVER数据库&#xff0c;正因为如此&#xff0c;很多人开始怀疑SQL SERVER的安全性。其实SQL SERVER2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的…

undefined symbol: ap_log_rerror;apache2.4与weblogic点so文件

没法子啊&#xff1b;只能用 httpd-2.2.26 https://www.google.com.hk/#newwindow1&qundefinedsymbol:ap_log_rerror&safestrictundefined symbol: ap_log_rerror[rootlocalhost local]# vi apache2/conf/httpd.conf[rootlocalhost local]# ./apache2/bin/apachectl s…

10个Java 8 Lambda表达式经典示例

Java 8 刚于几周前发布&#xff0c;日期是2014年3月18日&#xff0c;这次开创性的发布在Java社区引发了不少讨论&#xff0c;并让大家感到激动。特性之一便是随同发布的lambda表 达式&#xff0c;它将允许我们将行为传到函数里。在Java 8之前&#xff0c;如果想将行为传入函数&…

Sql server 2005带来的分页便利

select threadid from (select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads) as T where T.Pos > 100000 and T.Pos < 100030 如果里面的这个表cs_threads数据量超大&#xff0c;比如&#xff0c;几亿条记录&#xff0c;那这个方法应该是…

想学Python?快看看这个教程!收藏!

Python入门从哪开始&#xff0c;90%以上的书上都是这样讲的&#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0c;介绍文件等IO操作.... 就这样一点一点往下说。然而这种按部就班的学习方法&#…

Struts1.x系列教程(4):标签库概述与安装

Struts的整个视图层&#xff08;就是MVC模式中的View层&#xff09;是由Struts的定制标签&#xff08;或者称为定制动作&#xff09;和客户端代码(Javascript、HTML等)实现的。这些Struts标签被写在JSP页面中&#xff0c;用于生成客户端代码、进行逻辑判断等工作&#xff0c;使…

绿盟科技与CCF成立“鲲鹏”科研基金 计划发力5大领域资助16个项目

【51CTO.com原创稿件】2017年5月10日&#xff0c;由中国计算机学会(CCF)和北京神州绿盟信息安全科技股份有限公司(以下简称&#xff1a;绿盟科技)主办的2017 CCF-绿盟科技“鲲鹏”科研基金新闻发布会于北京隆重举行。双方共同宣布“鲲鹏”科研基金正式成立&#xff0c;该基金将…

修改SQL SERVER内置存储过程

SQLSERVER估计是为了安装或者其它方面&#xff0c;它内置了一批危险的存储过程。能读到注册表信息&#xff0c;能写入注册表信息&#xff0c;能读磁盘共享信息等等……各位看到这儿&#xff0c;心里可能会在想&#xff0c;我的网站中有其它的代码&#xff0c;又不像查询分析器那…

〖Linux〗使用Qt5.2.0开发Android的NDK应用程序

2013年12月11日&#xff0c;Qt发布了其新的Qt版本&#xff1a;Qt5.2.0&#xff1b; 利用这个新的版本&#xff0c;我们可以很轻松地制作出Android手机的NDK应用程序。 开发环境&#xff1a;Ubuntu13.10 x86_64 下载链接&#xff1a;http://download.qt-project.org/official_re…

基于 OpenCV 的面部关键点检测实战

【 编者按】这篇文章概述了用于构建面部关键点检测模型的技术&#xff0c;这些技术是Udacity的AI Nanodegree程序的一部分。作者 | 小白责编 | 欧阳姝黎概述在Udacity的AIND的最终项目中&#xff0c;目标是创建一个面部关键点检测模型。然后将此模型集成到完整的流水线中&#…