导航:首页 > 编程语言 > 计算机编程数字分离

计算机编程数字分离

发布时间:2022-05-21 04:58:27

‘壹’ 各位电脑高手,关于C语言的问题想请教各位:用递归法将一个正整数n的各个数字分别输出。麻烦各位啦,谢谢

楼上的兄弟
你的程序有问题吧
你的递归出口设置错了 不会有数输出
还有用你的算法
如果n=1200
你输出的也是0 0 2 1
可是好像应该输出1 2 0 0才对啊

#include<stdio.h>
#include<math.h>

void out(int n,int i)
{
int x,y,j;
y=int(pow(10,i));
if (n!=0)
{
x=n/y;
n=n-x*y;
printf("%d ",x);
}
else printf("0 ");
i--;
if(i>=0) out(n,i);
}

void main()
{
int n,x,y,i;
printf("输入要处理的数字:");
scanf("%d",&n);
x=n;
i=-1;

while(x!=0)
{
x=x/10;
i++;
}
printf("\n\n");
printf("输出处理后的数字:");
out(n,i);
}

‘贰’ 计算机编程,将一个TXT文本或log文件中的数字提取成矩阵形式并进行运算,求大神帮忙

#proc.pl
useList::Utilqw/sum/;
while(<>){
<>;@a=split;$C1=2*$a[0]-sum(@a);
<>;
<>;@a=split;$C1=2*$a[0]-sum(@a);
if($C1!=$C2){print"C1=$C1 C2=$C2 "}
}

在cmd.exe中执行

perl proc.pl < input.txt > output.txt

output.txt就是你的结果

‘叁’ 用C语言编输入一个3位的正整数,分别输出它的个位,十位,百位数字

代码如下:
#include<stdio.h>
void main()
{
int n,a,b,c;
scanf("%d",&n);
a=n; c=a%10; a/=10; b=a%10; a/=10; a%=10;
printf("%d的个位为%d,十位为%d,百位为%d。\n",n,c,b,a);
}
c语言:
1.简介:
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。
2.基本特性
1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。
2、结构式语言:结构式语言的显着特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
4、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。
5、使用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
3.特有特点
1.C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
2.C

‘肆’ 计算机三级编程题

在子程序中,i,j作为计数器。a4、a3、a2、a1分别暂存每个四位数由高到低的四个数字,
“a4=a[i]/1000;
a3=a[i]%1000/100;
a2=a[i]%100/10;
a1=a[i]%10;”就是通过取余和整除运算把各位数字分离出来。
a4、a3、a2、a1同时不能被2整除(也就是取余结果为零)是题设的限制条件,用与的关系。
经过“b[cnt]=a[i];
cnt++;”b[]中保存的是符合条件的数,由于数组角标由0开始,cnt的值就是满足条件的数的个数。
后面是典型的冒泡法排序。

‘伍’ 语言编程 输入一个整数,从高位开始逐位分割并输出它的各位数字

1、首先,定义三个整型变量,保存整数、各位上的数、整数的位数。

‘陆’ 如何将十进制数123的各个位的数字单独分离出来简答

两种方法:
一、fortran语言
可以将整数变量写入字符串,然后依次将每一位再读出来存为整型变量。代码如下:
integer a,b,c,m
character*3 str
m=123
write(str,'(i3)') m
read(str,'(3i1)') a,b,c
write(*,*) a,b,c
end
输出是:1 2 3

二、不论什么编程语言,可以用除以10求余数的方式来分离各位数。
下面用伪代码描述:
m为整数
计算机对整数除法的商只保留整数,舍去它的小数部分
m=abc=123
m除以10,求余数,得:m=ab=12,c=3
m除以10,求余数,得:m=a=1,b=2
a=1,b=2,c=3
更多位的数字,可以以此类推。

希望能帮到你!

‘柒’ 把数字n拆分一些正整数的和,问有多少种本质不同的方法

编写的代码如下:

#include<iostream>
using namespace std;
long i;
void shu(long n,long a,long b)
{
for(int s=0 ;a+s<=bn;++s)
{
if(!(n-a-s))
{
++i;
continue;
}
else if(n-a-s<0)continue;
else if(n-a-s>0)shu(n-a-s,a,b);
}

}
void main()
{
long n,a,b;
while(cin >> n>>a>>b)
{
i=0;
shu(n,a,b);
cout<<i<<endl;
}
}
编程语言(programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。

‘捌’ 计算机编程是什么

计算机语言:计算机语言通常是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。 计算机语言通常分为三类:即机器语言,汇编语言和高级语言。 1. 机器语言 机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。 用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。现在,除了计算机生产厂家的专业人员外,绝大多数程序员已经不再去学习机器语言了。 2.汇编语言 为了克服机器语言难读、难编、难记和易出错的缺点,人们就用与代码指令实际含义相近的英文缩写词、字母和数字等符号来取代指令代码(如用ADD表示运算符号“+”的机器代码),于是就产生了汇编语言。所以说,汇编语言是一种用助记符表示的仍然面向机器的计算机语言。汇编语言亦称符号语言。汇编语言由 于是采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码, 而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。 汇编语言中由于使用了助记符号,用汇编语言编制的程序送入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的 “汇编程序“的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。 汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。汇编语言是低级语言。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。 3.高级语言 不论是机器语言还是汇编语言都是面向硬件的具体操作的,语言对机器的过分依赖,要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员是难以做到的,对于计算机的推广应用是不利的。计算机事业的发展,促使人们去寻求一些与人类自然语言相接近且能为计算机所接受的语意确定、规则明确、自然直观和通用易学的计算机语言。这种与自然语言相近并为计算机所接受和执行的计算机语言称高级语言。高级语言是面向用户的语言。无论何种机型的计算机, 只要配备上相应的高级语言的编译或解释程序,则用该高级语言编写的程序就可以通用。 目前被广泛使用的高级语言有BASIC、PASCAL、C、COBOL、FORTRAN、LOGO以及VC、VB等。这些语言都是属于系统软件。 (了解内容二) 计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。这种“翻译”通常有两种方式,即编译方式和解释方式。编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。解释方式是:源程序进入计算机时,解释程序边扫描边解释作逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。PASCAL、 FORTRAN、COBOL等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C语言是能书写编译程序的高级程序设计语言。每一种高级(程序设计)语言,都有自己人为规定的专用符号、英文单词、语法规则和语句结构(书写格式)。高级语言与自然语言(英语)更接近,而与硬件功能相分离(彻底脱离了具体的指令系统),便于广大用户掌握和使用。高级语言的通用性强,兼容性好,便于移植。下面介绍几种较有代表性的高级程序设计语言: ⑴BASIC语言 BASIC语言全称是Beginner’s all Purpose Symbolic Instruction Code,意为“初学者通用符号指令代码“。1964年由美国达尔摩斯学院的基米尼和科茨完成设计并提出了BASIC语言的第一个版本,经过不断丰富和发展,现已成为一种功能全面的中小型计算机语言。BASIC易学、易懂、易记、易用,是初学者的入门语言,也可以作为学习其他高级语言的基础。BASIC有解释方式和编译方式两种翻译程序。 ⑵PASCAL语言 PASCAL是一种结构程序设计语言,由瑞士苏黎世联邦工业大学的沃斯(N.Wirth)教授研制,于1971年正式发表。是从ALGOL60衍生的,但功能更强且容易使用。目前,作为一个能高效率实现的实用语言和一个极好的教学工具,PASCAL语言在高校计算机软件教学中一直处于主导地位。 Pascal(B.Pascal)是十七世纪法国着名数学家,他于1642年曾发明现代台式计算机的雏型机—加减法计算机。 PASCAL具有大量的控制结构,充分反映了结构化程序设计的思想和要求,直观易懂,使用灵活,既可用于科学计算,又能用来编写系统软件,应用范围日益广泛。 ⑶通用编程语言C C语言是美国AT&T(电报与电话)公司为了实现UNIX系统的设计思想而发展起来的语言工具。C语言的主要特色是兼顾了高级语言和汇编语言的特点,简洁、丰富、可移植。相当于其他高级语言子程序的函数是C语言的补充,每一个函数解决一个大问题中的小任务,函数使程序模块化。C语言提供了结构式编程所需要的各种现代化的控制结构。 C语言是一种通用编程语言,正被越来越多的计算机用户所推崇。使用C语言编写程序,既感觉到使用高级语言的自然,也体会到利用计算机硬件指令的直接,而程序员却无需卷入汇编语言的繁琐。 ⑷COBOL语言 COBOL的全称是Common Business Oriented Language,意即:通用商业语言。 在企业管理中,数值计算并不复杂,但数据处理信息量却很大。为专门解决经企管理问题,于1959年,由美国的一些计算机用户组织设计了专用于商务处理的计算机语言COBOL,并于1961年美国数据系统语言协会公布。经不断修改、丰富完善和标准化,已发展为多种版本。 COBOL语言使用了300多个英语保留字,大量采用普通英语词汇和句型,COBOL程序通俗易懂,素有“英语语言”之称。 COBOL语言语法规则严格。用COBOL语言编写的任一源程序,都要依次按标识部、环境部、数据部和过程部四部分书写,COBOL程序结构的“部” 内包含“节”,“节”内包含“段”,段内包含语句,语句由字或字符串组成,整个源程序象一棵由根到干,由干到枝,由枝到叶的树,习惯上称之为树型结构。 目前COBOL语言主要应用于情报检索、商业数据处理等管理领域。 常用的高级程序设计语言,除了上述的几种之外,还有很多,如以英国着名诗人拜伦(G.N.G.Byron)的独生女艾达·拜伦(Ada Byron)的名字命名的军用语言Ada,深受中、小学生欢迎的语言LOGO等等。 目前,程序设计语言及编程环境正向面向对象语言及可视化编程环境方向发展,出现了许多第四代语言及其开发工具。如:微软公司(Microsoft)开发的Visual系列(VC++、VB、FoxPro)编程工具及Power Builder等,目前已经在国内外得到了广泛的应用。

麻烦采纳,谢谢!

‘玖’ C语言怎样提取一个数的十位个位百位千位

设一个数为n,则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10

代码如下:

#include<stdio.h>

int main(){

int n = 123456;

int unitPlace = n / 1 % 10;

int tenPlace = n / 10 % 10;

int hundredPlace = n / 100 % 10;

int thousandPlace = n / 1000 % 10;

printf("个位:%d 十位:%d 百位:%d 千位:%d ", unitPlace, tenPlace, hundredPlace, thousandPlace);

getchar();

return 0;

}

运行结果如图:

(9)计算机编程数字分离扩展阅读

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

‘拾’ 谁能告诉我如何用计算机编程的语言比如1和0表示出1到10的数字

本文字数:4894 字
阅读本文大概需要:13 分钟

写在之前

我们都知道,对于同一个问题来说,可以有多种解决问题的算法。尽管算法不是唯一的,但是对于问题本身来说相对好的算法还是存在的,这里可能有人会问区分好坏的标准是什么?这个要从“时效”和“存储”两方面来看。

人总是贪婪的,在做一件事的时候,我们总是期望着可以付出最少的时间、精力或者金钱来获得最大的回报,这个类比到算法上也同样适用,那就是花最少的时间和最少的存储做成最棒的解决办法,所以好的算法应该具备时效高和存储低的特点。这里的“时效”是指时间效率,也就是算法的执行时间,对于同一个问题的多种不同解决算法,执行时间越短的算法效率越高,越长的效率越低;“存储”是指算法在执行的时候需要的存储空间,主要是指算法程序运行的时候所占用的内存空间。

时间复杂度

首先我们先来说时间效率的这个问题,这里的时间效率就是指的算法的执行时间,时间的快慢本来就是一个相对的概念,那么到了算法上,我们该用怎样的度量指标去度量一个算法的时间效率(执行时间)呢?

刚开始我们想出了一种事后统计方法,我称它为“马后炮式”,顾名思义,就是对于要解决的某个问题,费尽心思想了 n 种解法,提前写好算法程序,然后攒了一堆数据,让它们分别在电脑上跑,跑完了然后比较程序的运行时间,根据这个来判断算法时效的高低。这种的判断技术计算的是我们日常所用的时间,但这并不是一个对我们来说有用的度量指标,因为它还依赖于运行的机器、所用的编程语言、编译器等等等等。相反,我们需要的是一个不依赖于所用机器或者编程语言的度量指标,这种度量指标可以帮助我们判断算法的优劣,并且可以用来比较算法的具体实现。

我们的科学家前辈们发现当我们试图去用执行时间作为独立于具体程序或计算机的度量指标去描述一个算法的时候,确定这个算法所需要的步骤数目非常重要。如果我们把算法程序中的每一步看作是一个基本的计量单位,那么一个算法的执行时间就可以看作是解决一个问题所需要的总步骤数。但是由于算法的执行过程又各不相同,所以这个每一步,即这个基本的计量单位怎么去选择又是一个令人头秃的问题。

下面我们来看一个简单的求和的函数:

defget_sum(n): sum = 0for i in range(1,n+1): sum += i return sumprint(get_sum(10))

我们仔细去分析一下上述代码,其实可以发现统计执行求和的赋值语句的次数可能是一个好的基本计数单位,在上面 get_sum 函数中,赋值语句的数量是 1 (sum = 0)加上 n (执行 sum += i 的次数)。

我们一般用一个叫 T 的函数来表示赋值语句的总数量,比如上面的例子可以表示成 T(n) = n + 1。这里的 n 一般指的是“数据的规模大小”,所以前面的等式可以理解为“解决一个规模大小为 n,对应 n+1 步操作步数的问题,所需的时间为 T(n)”。

对于 n 来说,它可以取 10,100,1000 或者其它更大的数,我们都知道求解大规模的问题所需的时间比求解小规模要多一些,那么我们接下来的目标就很明确了,那就是“寻找程序的运行时间是如何随着问题规模的变化而变化”。

我们的科学家前辈们又对这种分析方法进行了更为深远的思考,他们发现有限的操作次数对于 T(n) 的影响,并不如某些占据主要地位的操作部分重要,换句话说就是“当数据的规模越来越大时,T(n) 函数中的某一部分掩盖了其它部分对函数的影响”。最终,这个起主导作用的部分用来对函数进行比较,所以接下来就是我们所熟知的大 O闪亮登场的时间了。

大 O 表示法

“数量级”函数用来描述当规模 n 增加时,T(n) 函数中增长最快的部分,这个数量级函数我们一般用“大 O”表示,记做 O(f(n))。它提供了计算过程中实际步数的近似值,函数 f(n) 是原始函数 T(n) 中主导部分的简化表示。

在上面的求和函数的那个例子中,T(n) = n + 1,当 n 增大时,常数 1 对于最后的结果来说越来不越没存在感,如果我们需要 T(n) 的近似值的话,我们要做的就是把 1 给忽略掉,直接认为 T(n) 的运行时间就是 O(n)。这里你一定要搞明白,这里不是说 1 对 T(n) 不重要,而是当 n 增到很大时,丢掉 1 所得到的近似值同样很精确。

再举个例子,比如有一个算法的 T(n) = 2n^2+ 2n + 1000,当 n 为 10 或者 20 的时候,常数 1000 看起来对 T(n) 起着决定性的作用。但是当 n 为 1000 或者 10000 或者更大呢?n^2 起到了主要的作用。实际上,当 n 非常大时,后面两项对于最终的结果来说已经是无足轻重了。与上面求和函数的例子很相似,当 n 越来越大的时候,我们就可以忽略其它项,只关注用 2n^2 来代表 T(n) 的近似值。同样的是,系数 2 的作用也会随着 n 的增大,作用变得越来越小,从而也可以忽略。我们这时候就会说 T(n) 的数量级 f(n) = n^2,即 O(n^2)。

最好情况、最坏情况和平均情况

尽管前面的两个例子中没有体现,但是我们还是应该注意到有时候算法的运行时间还取决于“具体数据”而不仅仅是“问题的规模大小”。对于这样的算法,我们把它们的执行情况分为“最优情况”、“最坏情况”和“平均情况”。

某个特定的数据集能让算法的执行情况极好,这就是最“最好情况”,而另一个不同的数据会让算法的执行情况变得极差,这就是“最坏情况”。不过在大多数情况下,算法的执行情况都介于这两种极端情况之间,也就是“平均情况”。因此一定要理解好不同情况之间的差别,不要被极端情况给带了节奏。

对于“最优情况”,没有什么大的价值,因为它没有提供什么有用信息,反应的只是最乐观最理想的情况,没有参考价值。“平均情况”是对算法的一个全面评价,因为它完整全面的反映了这个算法的性质,但从另一方面来说,这种衡量并没有什么保证,并不是每个运算都能在这种情况内完成。而对于“最坏情况”,它提供了一种保证,这个保证运行时间将不会再坏了,**所以一般我们所算的时间复杂度是最坏情况下的时间复杂度**,这和我们平时做事要考虑到最坏的情况是一个道理。

在我们之后的算法学习过程中,会遇到各种各样的数量级函数,下面我给大家列举几种常见的数量级函数:

为了确定这些函数哪些在 T(n) 中占主导地位,就要在 n 增大时对它们进行比较,请看下图(图片来自于 Google 图片):

在上图中,我们可以看到当 n 很小时,函数之间不易区分,很难说谁处于主导地位,但是当 n 增大时,我们就能看到很明显的区别,谁是老大一目了然:

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

我们下面就来分析几个上述所说的“数量级函数”:

1.常数函数

n = 100 # 1 次sum = (1 + n) *n / 2 # 1 次print(sum) # 1 次

上述算法程序的 f(n) = 3,可能有人看到这会说那么时间复杂度就是 O(f(n)) = O(3),其实这个是错的,这个函数的时间复杂度其实是 O(1)。这个对于初学者来说是很难理解的一种结果,其实你可以把 sum = (1 + n) * n / 2 多复制几次再来看:

a = 100 # 1 次sum = (1 + n) * n / 2 # 1 次sum = (1 + n) * n / 2 # 1 次sum = (1 + n) * n / 2 # 1 次sum = (1 + n) * n / 2 # 1 次sum = (1 + n) * n / 2 # 1 次sum = (1 + n) * n / 2 # 1 次print(sum) # 1 次

上述算法的 f(n) = 8,事实上你可以发现无论 n 为多少,上述两段代码就是 运行 3 次和运行 8 次的区别。这种与数据的规模大小 n 无关,执行时间恒定的算法我们就叫它具有 O(1) 的时间复杂度。不管这个常数是多少,我们都记作是 O(1),而不是 O(3) 或者是 O(8)。

2.对数函数

cnt = 1while cnt < n: cnt *= 2 # O(1)

上面的算法程序的时间复杂度就是 O(logn),这个是怎么算出来的呢?其实很简单:上述的代码可以解释成 cnt 乘以多少个 2 以后才能大于等于 n,我们假设个数是 x,也就是求 2^x = n,即 x = log2n,所以这个循环的时间复杂度就是 O(logn)。

最后呢,我们来看看下面的这个例子,借助这段代码来详细的说一下我们如何对其时间复杂度进行详细的分析:

a = 1b = 2c = 3for i inrange(n):for j inrange(n): x = i * i y = j * j z = i * jfor k inrange(n): u = a * k + b v = c * cd = 4

上面的代码没有任何意义,甚至不是一个可运行的代码,我只是用来说明你在以后如何对代码进行执行分析,关于代码本身可不可以运行,就不需要你在这关心了。

上面的代码其实我们要分的话可以分成 4 部分:第 1 部分是 a,b,c 这 3 个赋值语句,执行次数也就是 3 次;第二部分是 3n^2,因为是循环结构,里面有 x,y,z 这 3 个赋值语句,每个语句执行了 n^2 次;第 3 部分是 2n,因为里面是 2 个赋值语句,每条语句被执行了 n 次;最后第 4 部分是常数 1,只有 d 这么 1 条赋值语句。所以我们得到的 T(n
) = 3+3n^2 +2n+1 = 3n^2+2n+4,看到指数项,我们自然的发现是 n^2 做主导,当 n 增大时,后面两项可以忽略掉,所以这个代码片段的数量级就是 O(n^2)。

空间复杂度

类比于时间复杂度的讨论,一个算法的空间复杂度是指该算法所耗费的存储空间,计算公式计作:S(n) = O(f(n))。其中 n 也为数据的规模,f(n) 在这里指的是 n 所占存储空间的函数。

一般情况下,我们的程序在机器上运行时,刨去需要存储程序本身的输入数据等之外,还需要存储对数据操作的“存储单元”。如果输入数据所占空间和算法无关,只取决于问题本身,那么只需要分析算法在实现过程中所占的“辅助单元”即可。如果所需的辅助单元是个常数,那么空间复杂度就是 O(1)。

空间复杂度其实在这里更多的是说一下这个概念,因为当今硬件的存储量级比较大,一般不会为了稍微减少一点儿空间复杂度而大动干戈,更多的是去想怎么优化算法的时间复杂度。所以我们在日常写代码的时候就衍生出了用“空间换时间”的做法,并且成为常态。比如我们在求解斐波那契数列数列的时候我们可以直接用公式去递归求,用哪个求哪个,同样也可以先把很多结果都算出来保存起来,然后用到哪个直接调用,这就是典型的用空间换时间的做法,但是你说这两种具体哪个好,伟大的马克思告诉我们“具体问题具体分析”。

写在之后

如果上面的文章你仔细看了的话,你会发现我不是直接上来就告诉你怎么去求时间复杂度,而是从问题的产生,到思考解决的办法,到“马后炮”,再到 T(n),最后到 O(n)一步一步来的。这样做的原因呢有两个:一是为了让你了解大 O 到底是怎么来的,有时候搞明白了由来,对于你接下来的学习和理解有很大的帮助;二是为了让这个文章看起来不是那么枯燥,我觉得很多时候上来扔给你一堆概念术语,很容易就让人在刚看到它的时候就打起了退堂鼓,循序渐进的来,慢慢引导着更容易接受一些。

很多人从大学到工作,代码写了不少依然不会估算时间复杂度,我感觉倒不是学不会,而是内心没有重视起来。你可能觉得计算机的更新换代很快,CPU 处理速度的能力越来越棒,没必要在一些小的方面斤斤计较,其实我觉得你是 too young too naive。我们随便来算一个简单的例子:有两台电脑,你的电脑的运算速度是我的电脑的 100 倍,同样一道问题,明明稍微想一想用 O(n) 可以做出来,你偏偏要懒,直接暴力 O(n^2),那么当 n 的数据稍微增大一些,比如上万上十万,到底谁的运算速度快还用我再告诉你吗?

所以今后在写算法的时候,请好好学会用时间复杂度估算一下自己的代码,然后想想有没有更有效率的方法去改进它,你只要这样做了,相信慢慢的你的代码会写的越来越好,头会越来越秃。(逃

最后说一点的是,估算算法的复杂度这件事你不要指望一下子看了一篇文章就想弄懂,这个还是要有意识的多练,比如看到一个程序的时候有意识的估算一下它的复杂度,准备动手写代码的时候也想想有没有更好的优化方法,有意识的练习慢慢就会来了感觉。这篇文章我就用了几个小例子,大概的估算方式就是这样。之后我还会继续写一些关于“数据结构与算法”相关的文章和一些具体的实战题目,都会带大家继续分析它们的时间复杂度,敬请期待。

阅读全文

与计算机编程数字分离相关的资料

热点内容
腾讯云应用服务器可以做什么 浏览:507
二次元表格编程 浏览:20
plc编程器保停 浏览:963
如何降低服务器的内存占用率 浏览:868
阿里云服务器是个什么意思 浏览:817
国内最好的数控编程培训学校 浏览:13
222乘104列是算法 浏览:159
程序员沟通正确姿势 浏览:969
魔玩app怎么视频推广 浏览:960
程序员抽奖送礼 浏览:458
北京java程序员薪资 浏览:658
如何创建网络平台或者app 浏览:355
python随机数生成控制概率 浏览:236
压缩机并联运行 浏览:899
两位单片机 浏览:63
四川音乐类投档线的算法 浏览:650
建行app如何改转账卡 浏览:27
android开发升级 浏览:299
要火社区app进不去怎么办 浏览:826
安卓手机上的自定义功能怎么用 浏览:230