文章 26
评论 0
浏览 7082
闲来无事

闲来无事

该文章已经加密。

Double类型数据造成的数据精度丢失

Double类型数据造成的数据精度丢失

这是由一道简单的蓝桥杯例题所得出的小经验,这道题目的主要内容是取一个数小数点后的某几位数字。 首先我想到,要取小数点后的n位数字,只要我将数小数点后的数字其乘以10的n次方,得到的整数部分不就是所求的数字吗? 于是我使用了这样的方式在 C++ 中计算: long long a = long long ( a * pow ( 10 , n ) ); 但最后验证结果却显示我的结果不正确,我与一份正确的代码进行对比,发现除了求阶乘部分不一样外,我们的代码是完全一样的。那么完全正确的代码中是如何求阶乘的呢? #define ll long long ll Qpow( ll a, ll b ) # a为底数 ,b为指数 { ll res = 1; while ( b ) # b不为0 { if ( b & 1 ) res = res * a; #b为1的情况下为最后一次运算,用res保存结果 a = a * a; #求a的平方 b >>= 1; #b除2,当b为1时除2结果为0,下一次跳出循环 } return res; } 那么为什么会出现,两种不同的求阶乘方式,最后的....

30米大刀硬是剪不动这个枝😭——经典DFS+剪枝(求一份AC代码)

30米大刀硬是剪不动这个枝😭——经典DFS+剪枝(求一份AC代码)

题目链接 我的代码如下: #include<iostream> #include<algorithm> #define long long ll using namespace std; int wood_length = 0; int * num, *state; int p, lenght, lastnum; int cmp(int a, int b) { return a > b; } bool dfs(int exist_num, int exist_length) { if (exist_num == 0 && exist_length == 0) return true; // 木棒用光,剩余长度也为0,成功 if (exist_num == 0 && exist_length != 0) return false; // 木棒用光,还有剩余长度,失败 if (exist_length == 0) exist_length = lenght; // 刚好拼完一根,继续拼下一根 int s = 0; if (exi....

全国大学生软件测试大赛赛后总结——移动端部分

全国大学生软件测试大赛赛后总结——移动端部分

移动应用测试 移动应用测试与自主可控测试类似,主要进行的操作为: 1.定位控件 2.操作控件 自主可控使用的工具名为Selenium,而移动应用测试使用的工具名为Appium,可以发现两个工具的名字十分相似,因此也印证了我上面所说的,两者类似。我非常建议想要去参加移动应用测试的同学顺便也参加一下自主可控测试因为两个比赛殊途同归。 言归正传我们介绍一下移动应用测试参赛的主要内容 0.Appium 的概述与安装 Appium是一个对移动端应用进行测试的软件,使用他可以获取应用当前界面中控件的属性,进而进行定位、操作,还可以录制脚本、导出脚本。 Appium的安装可以参照我的另一篇教程:Appium自闭之旅 1. 模拟器安装 Selenium是驱动浏览器进行测试的,而Appium是驱动手机进行测试的,该比赛的软件环境建议在不高于Android 6的环境下进行,但是现在的手机都已经更新到Android 9了,用自己的手机就会出现测试上的问题,所以建议大家使用模拟器进行测试。 模拟器的选择,建议大家使用雷电模拟器,这个结论是我们在尝试了5款市面上常用的模拟器后得出的。模拟器大家自行进行下载即....

全国大学生软件测试大赛赛后总结——综述

全国大学生软件测试大赛赛后总结——综述

说在前面 总的来说这个比赛真的不算特别难,相较于我参加过的其他比赛以蓝桥杯为例,这种算法比赛更需要参赛者的算法功底与逻辑推理能力。但今天我们说的软测比赛个人看来更是一个考察经验的比赛,熟能生巧。也就是说即使你没有很聪明的头脑,也没有很强的语言基础也可以胜任这个比赛。 但是很多当初一起报名参加的小伙伴都半路退出了是十分令人觉得可惜的。赛后想来究其原因只有二字——毅力。无论是这个比赛还是其他比赛其他的事情,轻言放弃都是无法有所收获的,所以在看这篇文章的同学,相信大概率你正犹豫要不要参加这个比赛,那么既然你都来到了这里,你需要做的就是相信你自己,然后坚持练习。 关于比赛 比赛分为5个赛项,而我参加了其中三者,所以下文也就介绍这三者 比赛主要使用的语言是Java,如果之前没有使用过或者不熟悉没关系,只要有C语言的知识即可,能看得懂基本的语法就可以。因为我就不熟悉Java。 比赛在难度不大的情况下,晋级规则为:预选赛->省赛->国赛 预选赛只要有一定成绩的选手都会晋级 这个一定的尺度我也不大懂,按理说是有成绩就应该都晋级啊,因为我当时有一个赛项就得了20分,都晋级了,但是老....

全国大学生软件测试大赛赛后总结——自主可控部分

全国大学生软件测试大赛赛后总结——自主可控部分

自主可控测试 这个是19年新加入的赛项,在我看来这个赛项最简单也最容易得分,如果你想参赛却对5个赛项都不很擅长,推荐选择这个。 自主可控测试听起来可能让人摸不到头脑,但是如果之前你接触过爬虫,你就会很容易理解和上手,没错这个赛项就是考察Selenium的相关知识。如果你说你也没有接触过,那么也没关系继续向下看就可以了。 题目类型 本赛项共分为三部分: 功能测试 性能测试 众包测试(总决赛才会有) 如果只是前两部分的话,就各占50%的分值,三部分的话就每个33%的分值。 功能测试 0. 环境配置 首先是浏览器,建议Chrome作为测试和编写脚本过程中使用,360最后提交成绩时使用,所以两个浏览器建议都下载。 Chromedriver,这个是Selenium驱动浏览器的驱动程序,这个驱动程序的版本需要与你浏览器的版本对应。 对照表 驱动下载 Selenium包下载,下载后放在C://mooctest目录下 环境变量配置,Chromedriver的路径需要加入环境变量中,将C://mooctest加入环境变量,还需再在系统变量中加入如下图的变量,变量的值为360chrome....

Linux 简单文件系统实现

Linux 简单文件系统实现

Linux 简单文件系统实现 前言 借鉴于Linux文件系统的实现 存储设备分区 文件系统的最终目的是把大量数据有组织的放入持久性的存储设备中,比如硬盘和磁盘。这些存储设备与内存不同。它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。 观察常见存储设备。最开始的区域是MBR,用于Linux开机启动(参考Linux开机启动)。剩余的空间可能分成数个分区(partition)。每个分区有一个相关的分区表(Partition table),记录分区的相关信息。这个分区表是储存在分区之外的。分区表说明了对应分区的起始位置和分区的大小。 我们在Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。 数据被存入到某个分区中。一个典型的Linux分区包含有下面各个部分: 分区的第一个部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR,随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux....

全国大学生软件测试大赛赛后总结——开发者测试部分

全国大学生软件测试大赛赛后总结——开发者测试部分

近期更新

Appium 自闭之旅

Appium 自闭之旅

该篇文章主要针对于 AppiumDesktop,AppiumServer 最后一版在 2016 年已经停更了,随后推出的 Desktop 配置起来更加方便,更加易用,故此推荐 Desktop。 注意:Desktop 和 Server 的安装步骤相差较大,而搜索 Appium 得到的结果大多数是 Server 的,不要被误导了。 Appium 安装: Appium下载地址 选择最新版本 exe 文件进行下载即可,下载后按照顺序进行安装即可。 相关环境配置: JAVA SDK 下载安装之后,需要添加环境变量: Android SDK 同样需要配置环境变量 到此 Appium 应该已经可以正常使用 打开 Appium 出现 点击打开服务器 点击右上角的放大镜图标 4. 左下角的所需功能需要我们根据自己的需要进行手动填写,可以选择 GUI 点击方式进行配置,也可以编辑右侧的 JSON 进行配置。 Appium 官方配置文档 -虽然可以配置很多属性,但关键的属性只有以下几个: appPackage :app 的包名 appActivity :app ....

分页寻址

分页寻址

文章借鉴 内存寻址之分页机制 与 内存分页、寻址方式那些事 写在前面 分页与分段机制 分段机制是Intel CPU一直保持的机制,而分页机制在80x86的计算机中是一种可选的机制,但只有在保护模式下才存在这种机制,也就是说保护模式下才存在分页寻址的机制,但保护模式不一定开启分页寻址机制. 内存碎片化问题: 进程A进来,向os申请了200的内存空间,于是os把0~199分配给A 进程B进来,向os申请了5的内存空间,os把200~204分配给它 进程C进来,向os申请了100的内存空间,os把205~304分配给它 这个时候进程B运行完了,把200-204还给os但是很长时间以后,只要系统中的出现的进程的大小>5的话,200-204这段空间都不会被分配出去(只要A和C不退出)。过了一段更长的时间,内存中就会出现许许多多200-204这样不能被利用的碎片 分页的原因 解决内存碎片化问题,分页机制将虚拟内存空间和物理内存空间划分为同样大小的单位-页面,并以页面作为最小分配单位,然后将内存按照页为单位进行内存分配,这样一段内存空间就可以属于很多进程.内存在虚拟中为连续的,物理中离散....

实模式寻址与保护模式寻址

实模式寻址与保护模式寻址

实模式寻址 8086/8088处理器只能在实模式下进行寻址 实模式寻址是为了解决16位字长的机器访问20位地址的问题,而解决的方法就是采用寄存器分段的方式。 因为机器字长为16位,故此一个段的最大大小为2的16次方,也即64K,但不是说段的的大小一定为64K。 段不能起始于任意位置,段必须起始于小段的的整数倍位置,小段的大小为16字节。在1MB的内存中存在64K个小段。这64K个小段用16位二进制就可以唯一标识,而小段内的16个字节可以用4位二进制标识。16+4便构成了20位地址。 但这20位地址如何计算得出呢? 以程序段为例,CS寄存器内保存着16位的段地址(XXXXH),IP寄存器内保存着16位的偏移量(YYYYH),将CS寄存器的16地址左移4位得到(XXXX0H)与偏移量相加即可得到最终的20位物理地址。 在操作系统中,段的存储地址的分配是由操作系统完成的,每个段可以独立的占有64KB的区域,但是各段也可以发生重叠。 例:某程序的代码段需要8KB的存储区,数据段需要2KB的存储区,那么在在代码段结束后的第一个小段就可以作为数据段的起始地址,这样看来代码段的64KB与数据段的64....

数据结构:线性表(番外)

数据结构:线性表(番外)

静态链表: 有时可以借助一维数组来表示线性链表 //------线性表的静态单链表存储结构------- #define MAXSIZE 1000 typedef struct { ElemType data; int cur; }component,Slinklist[MAXSIZE] 数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的位置。在线性表的删除和插入操作时不需要移动元素,仅需要修改游标。 多项式计算: 简单的我们可以想到,用一维数组表示一个多项式,用数组的下标表示多项式中每一项的指数,用数组中每个位置上的值表示对应的系数。 但是这样存在一个问题:形如S(x) = 1 + 3x10000 – 2x20000这样的多项式,指数项的值非常大,但非零项却非常少,导致一维数组浪费的空间很大。 为此我们可以用单链表来实现。在单链表中每个结点有两个数据项(系数项和指数项)。 typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 } term, ElemType; //多项式相加 void Add....

数据结构:线性表(2)

数据结构:线性表(2)

顺序存储: 以元素在计算机内的“物理位置”相邻来表示线性表中的数据元素的逻辑关系。 并以表中第一个元素的存储位置作为线性表的基地址。 LOC(ai ) = LOC(ai-1 ) + C LOC(ai ) = LOC(a1 ) + (i-1)×C 线性表顺序存储结构的特点 1.逻辑上相邻的元素,其物理位置也相邻; 2.可随机存取表中任一元素; 3.必须按最大可能长度预分存储空间,存储空间利用率低,表的容量难以扩充,是一种静态存储结构; 4.插入删除时,需移动大量元素,平均移动元素为n/2。 操作: 插入: Status listinsert (List &L,int i,ElenType e) { if (i<1||i>L.lenght) return error; if (L.lenght>=L.maxsize) { newbase=(ElemType*)realloc(sizeof(maxsize+newsize)*sizeof(ElemType)); if (!newbase) exit(1); L.elem=newbase; L.maxsixe+=n....

数据结构:线性表(1)

数据结构:线性表(1)

线性结构特点: 1.存在唯一的第一个“数据元素”。 2.存在唯一的最后一个“数据元素”。 3.除第一个元素外,集合中元素存在唯一后继,除最后一个元素外,集合中元素存在唯一前驱。 线性表: 1.一个线性表是n个数据结构的有序集合 2.线性表中数据元素的个数称为线性表的个数,n=0时称为空表 线性表基本操作: 结构初始化 InitList(*L) 操作结果:构造一个空的线性表 L 销毁结构 DestroyList(*L) 初始条件:线性表 L 已存在 操作结果:销毁线性表 L PriorElem( L, cur_e, *pre_e ) 初始条件:线性表 L 已存在 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回它的前驱,否则操作失败,pre_e 无定义 NextElem( L, cur_e, *next_e ) 初始条件:线性表 L 已存在 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返回它的后继,否则操作失败,next_e 无定义 ListEmpty( L ) 初始条件:线性表L已存在 操作结果:若 L 为空表,则返回 TRUE,否则返回 ....

数据结构:基础部分

数据结构:基础部分

算法: 算法是规则的有限集合,是为了解决特定问题的方法 特性: 1.有穷性、2.确定性、3.可行性、4.零或多个输入、5.一或多个输出 设计要求: 1.正确、2.可读、3.健硕、4.效率与空间 算法效率的度量: 算法中基本操作重复执行的次数记作:T(n)=O(f(n)),称为时间复杂度 一般来说他是最深层循环语句的执行次数的近似。 例如: for (i=2;i<=n;i++) { for (j=2;j<=i-1;i++) { x++; } } x++;这条语句的频度表达式为(n-1)(n-2)/2,所以该代码块的时间复杂度为O(n*n) 例外: 有些问题中,基本语句的重复执行次数还与问题的输入有关,这种情况下,一种方法是计算时间复杂度的平均值,另一种更常用的方法是讨论算法在最坏情况下的时间复杂度。

2018年——全国行政区划代码

2018年——全国行政区划代码

在进行一项基于爬虫的项目开发过程中,需要对行政区划代码进行匹配,如果是精确到省级单位还好处理,但如果是精确到市级单位或者更下一级,就不能单纯手写字典去匹配了。 一开始我采取的是爬取一个第三方网站:https://xingzhengquhua.51240.com/ 这个网站的设计比较简单,查询时的速率比较快。 下面放上爬取这个网站的代码 import requests from lxml import etree http_later="00000000__xingzhengquhua/" http_former="https://xingzhengquhua.51240.com/" city_num='2100' website=http_former+city_num+http_later html=requests.get(website).text htmls=etree.HTML(html) tip=htmls.xpath('//*[@id="main_content"]/table/tr/td/table/tr[1]/td/a[last()]') print(tip[0].....

百度竞价排名小工具😜

百度竞价排名小工具😜

众所周知百度盈利的一个很重要的途径是广告的竞价排名 商家想要向受众推销自己的产品,可以借助百度这样一个平台,但百度的竞价排名并不是一成不变的,商家想要实时观察百度对自己产品的推广情况,我作为爬虫技术的入门者,课外时间和自己的同学开发了这样的一个小工具。 该工具借助python的requests库以及lxml解析库实现主要功能,通过tkinter库实现图像界面,threading库实现多线程。同时显示多条排名。其余还有json库用于处理网页信息。 首先确定我们需要的信息:投放广告公司的名称和网址。 公司名称隐含在V3的标签里 然后使用浏览器F12的开发者工具,定位元素的HTML代码。 但尝试了几次后发现,元素的class似乎是一个随机的字符串,每次刷新后,class都会发生改变。 但山重水复疑无路柳岸花明又一广告,通过定位每条广告右下角浅蓝色的小广告,发现虽然这个元素的class每次也都不同, 但是他们有一个特点:font标签的class属性不管前半部分是什么字符,后半部分都为:ec_tuiguang_container,于是便对边标签class属性进行模糊匹配。 定位到广告后....

Iverilog & GTKWave

Iverilog & GTKWave

一直都因为太过懒惰,没有更新网站的文章。 正好最近学校小学期的任务是,进行VerilogHDL语言的学习,需要安装可以编译该语言的软件,课上学习使用的vivado,当时学的时候就是云里雾里,现在需要用到了,打算在自己的电脑上安装一个,看到软件大小10.4G,果断放弃。 一顿搜索引擎,发现大家与我意见一致,vivado对我们来说确实是屠龙刀了。 更好的选择是 Iverilog 加上 GTKWave 直接从Icarus Verilog for Windows下载安装即可,这里提供的为Windows版 Icarus Verilog中已经包含了GTKWave,不必再额外下载 注意安装时是默认全部安装,不要自作聪明自定义,反而弄巧成拙 安装时最后有一步,可以自动将其需要用到的路径,加入自动变量,建议设置 安装之后就可以编辑一个verilog文件了 /***** ** 文件名称:hello_world_tb.v ** 功能描述:一个iverilog和GTKWave使用方式介绍的hello world例子 *****/ // synopsys translate_off `timescale 1....

谱聚类初探

谱聚类初探

本学期初参加了我校的一个大学生科技活动。 导师甩给我的课题是:“谱聚类算法”,我自己选择的应用方向是“图像分割”。 在网上大量浏览相关帖子后,终于对该算法有了一个大概的掌握。 https://www.cnblogs.com/pinard/p/6221564.html 个人觉得上面这篇博客对算法总体的阐述比较好。 可以作为了解该算法的一篇入门文章。 所谓聚类,如名字一样,就是将杂乱无章的数据,按照彼此之间的相似度,分为几类。其中大量使用了矩阵变换的知识。 输入: 样本集D=(x1,x2,...,xn)(x1,x2,...,xn)。 我是直接从.mat文件读取数据,也可以用matplotlib.pyplot库的imread函数读取普通图片。 写作: import matplotlib.pyplot as plt pic = plt.imread('one.png') 输出: 簇划分C(c1,c2,...ck2)C(c1,c2,...ck2). 再使用 plt.show() 便可以将图像显示出来。 算法如下: 根据输入的相似矩阵的生成方式构建样本的相似矩阵S(网上好多帖子都提示使用“高....

报数游戏

报数游戏

线性表实验