使用Python编程:求10-n间所有7的倍数的积

如果有人问你 ——“现在世界上增长最快的编程语言是什么?”答案很简单。那就是 Python。由于其简单的语法和丰富的库,它在世界范围内受到欢迎。现在,你几乎可以用python做任何事情:数据科学、机器学习、信号处理、数据可视化——你能想到的都可以。然而,许多人声称Python在解决严重问题时有点慢。但是,执行程序的时间取决于编写的代码。通过一些提示和技巧,可以加速Python代码并提高程序的性能。

加速Python代码的提示和技巧

如果您正在寻找提高python代码速度的方法,这篇文章很适合您。阐述了减少程序执行时间的技术和策略。这些技巧不仅可以加快代码的速度,还可以提高Python技能。

Python有大量的库函数和模块。它们是由专业的开发人员编写的,并经过了多次测试。因此,这些函数是非常高效的,并有助于加速代码——如果函数在库中已经可用,则不需要编写代码。在这方面,我们举一个简单的例子。

代码分析是优化代码的经典方法。有许多模块来测量程序的统计数据。这让我们知道程序在哪里花费了太多时间,以及如何优化它。所以,为了保证优化,进行一些测试,并增强程序,提高效果。

计时器是剖析器之一。您可以在代码的任何地方使用它,并找到每个阶段的运行时。然后我们可以改进花费太长时间的程序。此外,还有一个内置的分析器模块叫做LineProfiler。它还提供了一份关于所消耗时间的描述性报告。

10、保持更新-使用最新版本的Python

有成千上万的开发人员定期向python添加更多的特性。我们今天使用的模块和图书馆功能将在明天的发展中过时。Python开发人员正在使这门语言变得越来越快、越来越可靠。每个新版本都提高了它的性能。

因此,我们需要将库更新到最新版本。Python 3.9现在是最新版本。python 2的许多库可能不能在Python3上运行。让我们记住这一点,并始终使用最新版本来获得最佳性能。

Python开发人员的价值正在与日俱增。那么,你还在等什么呢!现在是您开始学习加快Python代码的时候了。我们提供的提示和技巧肯定会帮助您编写高效的代码。如果你遵循它们,我们希望你可以改进你的代码,学习更高级的Python知识。

我们试图展示加速代码所需的所有主要技巧和提示。我们希望这篇文章已经回答了您的大部分问题。现在,剩下的就看你了。然而,知识没有止境,学习也没有止境。所以,如果我们错过了什么重要的东西,请告诉我们。祝学习快乐!

}

注:第七章只有一道题,因为正则表达式学校尚不要求我就还没看,所以这道题解的链接是另一个大佬的


3-1 大于身高的平均值

中小学生每个学期都要体检,要量身高,因为身高可以反映孩子的生长状况。现在,一个班的身高已经量好了,请输出其中超过平均身高的那些身高。程序的输入为一行数据,其中以空格分隔,每个数据都是一个正整数。程序要输出那些超过输入的正整数的平均数的输入值,每个数后面有一个空格,输出的顺序和输入的相同。

在一行输入中一个班的身高值,以空格分隔。

在一行输出超过输入的平均数的输入值,以空格分隔。

在这里给出一组输入。例如:

在这里给出相应的输出。例如:

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

3-3 输出字母在字符串中位置索引

输入一个字符串,再输入两个字符,求这两个字符在字符串中的索引。

第二行输入两个字符,用空格分开。

反向输出字符和索引,即最后一个最先输出。每行一个。

在这里给出一组输入。例如:

在这里给出相应的输出。例如:

本题要求编写程序,从给定字符串中查找某指定的字符。

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。

如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。

本题要求提取一个字符串中的所有数字字符(‘0’……‘9’),将其转换为一个整数输出。

输入在一行中给出一个不超过80个字符且以回车结束的字符串。

在一行中输出转换后的整数。题目保证输出不超过长整型范围。

3-6 求整数序列中出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入在一行中给出序列中整数个数N(0

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

3-7 求最大值及其下标

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

输入在第一行中给出一个正整数n(1n≤10)。第二行输入n个整数,用空格分开。

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

在一行中输出逆序后的字符串。

3-9 字符串转换成十进制整数

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入在一行中给出一个以#结束的非空字符串。

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

3-10 统计大写辅音字母

英文辅音字母是除AEIOU以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出在一行中给出字符串中大写辅音字母的个数。

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

按照以下格式输出排序后的结果:

3-12 求整数的位数及各位数字之和

对于给定的正整数N,求它的位数及其各位数字之和。

输入在一行中给出一个不超过109的正整数N。

在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出在一行中给出替换完成后的字符串。

3-14 字符串字母大小写转换

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入为一个以“#”结束的字符串(不超过30个字符)。

在一行中输出大小写转换后的结果字符串。

3-15 统计一行文本的单词个数

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

在一行中输出单词个数。

3-16 删除重复字符

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入是一个以回车结束的非空字符串(少于80个字符)。

输出去重排序后的结果字符串。

输入一个字符串 str,再输入要删除字符 c,大小写不区分,将字符串 str 中出现的所有字符 c 删除。

在第一行中输入一行字符 在第二行输入待删除的字符

在一行中输出删除后的字符串

在这里给出一组输入。例如:

在这里给出相应的输出。例如:

3-18 输出10个不重复的英文字母

随机输入一个字符串,把最左边的10个不重复的英文字母(不区分大小写)挑选出来。 如没有10个英文字母,显示信息“not found”

在一行中输出最左边的10个不重复的英文字母或显示信息“not found"

在这里给出一组输入。例如:

在这里给出相应的输出。例如:

在这里给出一组输入。例如:

在这里给出相应的输出。例如:

3-19 找最长的字符串

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

在一行中用以下格式输出最长的字符串:

如果字符串的长度相同,则输出先输入的字符串。

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

每个测试是一个3位的正整数。

3-21 判断回文字符串

输入一个字符串,判断该字符串是否为回文。回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出在第1行中输出字符串。如果它是回文字符串,在第2行中输出Yes,否则输出No

3-22 输出大写英文字母

本题要求编写程序,顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍;若无大写英文字母则输出“Not Found”。

输入为一个以回车结束的字符串(少于80个字符)。

按照输入的顺序在一行中输出所出现过的大写英文字母,每个字母只输出一遍。若无大写英文字母则输出“Not Found”。

}

数维杯·赛事资讯·数模干货·辅助报名


1: 遗传算法理论的由来

3: 遗传算法具体步骤

3.1 初始化(编码)

4.2 创造染色体(编码)

4.3 个体、种群与进化

注:本文是根据参考文献几篇文章及个人理解整合而来

1:遗传算法理论的由来

我们先从查尔斯·达尔文的一句名言开始:

能够生存下来的往往不是最强大的物种,也不是最聪明的物种,而是最能适应环境的物种。

你也许在想:这句话和遗传算法有什么关系?其实遗传算法的整个概念就基于这句话。

让我们用一个基本例子来解释 :

我们先假设一个情景,现在你是一国之王,为了让你的国家免于灾祸,你实施了一套法案:

  • 你选出所有的好人,要求其通过生育来扩大国民数量。

  • 这个过程持续进行了几代。

  • 你将发现,你已经有了一整群的好人。

这个例子虽然不太可能,但是我用它是想帮助你理解概念。也就是说,我们改变了输入值(比如:人口),就可以获得更好的输出值(比如:更好的国家)。现在,我假定你已经对这个概念有了大致理解,认为遗传算法的含义应该和生物学有关系。那么我们就快速地看一些小概念,这样便可以将其联系起来理解。

首先我们回到前面讨论的那个例子,并总结一下我们做过的事情。

  1. 首先,我们设定好了国民的初始人群大小。

  2. 然后,我们定义了一个函数,用它来区分好人和坏人。

  3. 再次,我们选择出好人,并让他们繁殖自己的后代。

  4. 最后,这些后代们从原来的国民中替代了部分坏人,并不断重复这一过程。

遗传算法实际上就是这样工作的,也就是说,它基本上尽力地在某种程度上模拟进化的过程。

因此,为了形式化定义一个遗传算法,我们可以将它看作一个优化方法,它可以尝试找出某些输入,凭借这些输入我们便可以得到最佳的输出值或者是结果。遗传算法的工作方式也源自于生物学,具体流程见下图:


  1. 智能式搜索:依据适应度(目标函数)进行只能搜索

  2. 渐进式优化:利用复制、交换、突变等操作,使下一代结果优于上一代

  3. 全局最优解:采用交换和突变操作产生新个体,使得搜索得到的优化结果逼近全局最优解

  4. 黑箱式结构:根据问题的特性进行编码(输入)和确定适应度(输出),具有只考虑输入与输出关系的黑箱式就够,并不深究输入与输出关系的原因

  5. 通用性强:不要求明确的数学表达式,只需要一些简单的原则要求,可应用于解决离散问题、函数关系不明确的复杂问题

  6. 并行式运算:每次迭代计算都是对群体中所有个体同时进行运算,是并行式运算方式,搜索速度快

为了让讲解更为简便,我们先来理解一下著名的组合优化问题「背包问题」。

比如,你准备要去野游 1 个月,但是你只能背一个限重 30 公斤的背包。现在你有不同的必需物品,它们每一个都有自己的「生存点数」(具体在下表中已给出)。因此,你的目标是在有限的背包重量下,最大化你的「生存点数」。


3.1 初始化(编码)

这里我们用遗传算法来解决这个背包问题。第一步是定义我们的总体。总体中包含了个体,每个个体都有一套自己的染色体。

我们知道,染色体可表达为二进制数串,在这个问题中,1 代表接下来位置的基因存在,0 意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题,所以特定位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是 Sleeping Bag,那么此时反映在染色体的『基因』位置就是该染色体的第一个『基因』。)


现在,我们将图中的 4 条染色体看作我们的总体初始值。

二进制编码由二进制符号0和1所组成的二值符号集。它有以下一些优点:1. 编码、解码操作简单易行 2. 交叉、变异等遗传操作便于实现 3. 合最小字符集编码原则 4. 利用模式定理对算法进行理论分析。

二进制编码的缺点是:对于一些连续函数的优化问题,由于其随机性使得其局部搜索能力较差,如对于一些高精度的问题,当解迫近于最优解后,由于其变异后表现型变化很大,不连续,所以会远离最优解,达不到稳定。

格雷码编码是其连续的两个整数所对应的编码之间只有一个码位是不同的,其余码位完全相同。

二进制码转为格雷码:异或运算:同则为0,异则为1。公式如下:


由格雷码转二进制的转换公式为:


优点:增强遗传算法的局部搜索能力,便于对连续函数进行局部空间搜索。使用非常广泛。

二进制编码虽然简单直观,但明显地。但是存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但增加了解码的难度,使遗传算法的搜索空间急剧扩大。

所谓浮点法,是指个体的每个基因值用某一范围内的一个浮点数来表示。编码长度等于决策变量的个数。在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。

  1. 适用于在遗传算法中表示范围较大的数

  2. 适用于精度要求较高的遗传算法

  3. 便于较大空间的遗传搜索

  4. 改善了遗传算法的计算复杂性,提高了运算交率

  5. 便于遗传算法与经典优化方法的混合使用

  6. 便于设计针对问题的专门知识的知识型遗传算子

  7. 便于处理复杂的决策变量约束条件

符号编码法是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如{A,B,C…}。

  1. 符合有意义积术块编码原则

  2. 便于在遗传算法中利用所求解问题的专门知识

  3. 便于遗传算法与相关近似算法之间的混合使用。

接下来,让我们来计算一下前两条染色体的适应度分数。对于 A1 染色体 [100110] 而言,有:



对于这个问题,我们认为,当染色体包含更多生存分数时,也就意味着它的适应性更强。因此,由图可知,染色体 1 适应性强于染色体 2。

现在,我们可以开始从总体中选择适合的染色体,来让它们互相『交配』,产生自己的下一代了。这个是进行选择操作的大致想法,但是这样将会导致染色体在几代之后相互差异减小,失去了多样性。因此,我们一般会进行「轮盘赌选择法」(Roulette Wheel Selection method)。

想象有一个轮盘,现在我们将它分割成 m 个部分,这里的 m 代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达出来。


基于上图中的值,我们建立如下「轮盘」。


现在,这个轮盘开始旋转,我们将被图中固定的指针(fixed point)指到的那片区域选为第一个亲本。然后,对于第二个亲本,我们进行同样的操作。有时候我们也会在途中标注两个固定指针,如下图:


通过这种方法,我们可以在一轮中就获得两个亲本。我们将这种方法成为「随机普遍选择法」(Stochastic Universal Selection method)。

在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体。那么用生物学的话说,所谓「交叉」,其实就是指的繁殖。现在我们来对染色体 1 和 4(在上一个步骤中选出来的)进行「交叉」,见下图:


这是交叉最基本的形式,我们称其为「单点交叉」。这里我们随机选择一个交叉点,然后,将交叉点前后的染色体部分进行染色体间的交叉对调,于是就产生了新的后代。

如果你设置两个交叉点,那么这种方法被成为「多点交叉」,见下图:


如果现在我们从生物学的角度来看这个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢?答案是否。在后代的生长过程中,它们体内的基因会发生一些变化,使得它们与父母不同。这个过程我们称为「变异」,它可以被定义为染色体上发生的随机变化,正是因为变异,种群中才会存在多样性。

下图为变异的一个简单示例:


变异完成之后,我们就得到了新为个体,进化也就完成了,整个过程如下图:


在进行完一轮「遗传变异」之后,我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够,那么就会用它们从总体中替代掉那些适应度不够的染色体。这里有个问题,我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?

一般来说,有如下几个终止条件:1. 在进行 X 次迭代之后,总体没有什么太大改变。2. 我们事先为算法定义好了进化的次数。3. 当我们的适应度函数已经达到了预先定义的值。

这节将讲述如何利用遗传算法解决一个二元函数的最大值求解问题。



4.2 创造染色体(编码)

我们尝试为上文所述的函数f(x,y)的最大值所对应的 x 和 y 的值构造染色体。也就是说,要在一组二进制位中存储函数 f(x,y) 的定义域中的数值信息。

假如设定求解的精度为小数点后6位,可以将区间[-10,10]划分为

个子区间。若用一组二进制位形式的染色体来表示这个数值集合,

,需要25位二进制数来表示这些解。换句话说,一个解的编码就是一个25位的二进制串。

现在,我们已经创建了一种 25 位长度的二进制位类型的染色体,那么对于任意一个这样的染色体,我们如何将其复原为[-10, 10]这个区间中的数值呢?这个很简单,只需要使用下面的公式即可:


例如 00 00 0000 0 和 11 11 1 这两个二进制数,将其化为 10 进制数,代入上式,可得 -10.0 和 10.0。这意味着长度为 25 位的二进制数总是可以通过上式转化为[-10, 10]区间中的数。

4.3 个体、种群与进化

染色体表达了某种特征,这种特征的载体,可以称为“个体”。例如,我本人就是一个“个体”,我身上载有 23 对染色体,也许我的相貌、性别、性格等因素主要取决于它们。众多个体便构成“种群”。

对于所要解决的二元函数最大值求解问题,个体可采用上一节所构造的染色体表示,并且数量为2个,其含义可理解为函数f(x, y)定义域内的一个点的坐标。许多这样的个体便构成了一个种群,其含义为一个二维点集,包含于对角定点为(-10.0, -10.0)和(10.0, 10.0)的正方形区域。

也许有这样一个种群,它所包含的个体对应的函数值会比其他个体更接近于函数f(x, y)的理论最大值,但是它一开始的时候可能并不比其他个体优秀,它之所以优秀是因为它选择了不断的进化,每一次的进化都要尽量保留种群中的优秀个体,淘汰掉不理想的个体,并且在优秀个体之间进行染色体交叉,有些个体还可能出现变异。种群的每一次进化后,必定会产生一个最优秀的个体。种群所有世代中的那个最优个体也许就是函数f(x, y)的最大值对应的定义域中的点。如果种群不休止的进化,它总是能够找到最好的解。但是,由于我们的时间是有限的,有可能等不及种群的最优进化结果,通常是在得到了一个看上去还不错的解时,便终止了种群的进化。

那么,对于一个给定的种群,通常上述讲过的选择、交叉、变异来进行进化。

# 如果在选择之前保留当前最佳个体,最终能收敛到全局最优解。

一文读懂遗传算法工作原理(附Python实现)

2022第七届数维杯夏令营报名火热进行中,本届夏令营限报200人,专家授课,零基础教学,参培人员获奖率高达80%,点击下方图片了解详情!

温馨提示:小编每天都在为大家用心甄选优质数模内容,更多数模干货已分类收录于往期合集【国赛、美赛】【数维杯】【常用软件】【算法模型】【经验分享】等,同学们于公众号内自行搜索即可,更多数模相关服务请移步【数模乐园官方旗舰店】了解详情,笔芯~

进入数模乐园官方旗舰店

看似寻常最奇崛,成如容易却艰辛。

}

我要回帖

更多关于 python求完数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信