数学与计算科学学院创新实践基地¶
数学与计算科学学院创新实践基地简介¶
创新基地,是在原来学院科协基础上建立起来得科技组织,旨在提高大学生的动手实践能力,培养一批具有高素质、创新性的学生团队,为学院科技创新提供一个崭新的平台。
创新基地采用以“项目”为核心,以个人实践为脊梁,以“老师指导”为源泉的运作管模式,有学生自主管理,负责学院的科技创新、动手实践能力、团队创作、团队合作意识的培养以及学院科技项目的申报、实践和验收工作。
了解我们¶
如果你想加入我们,那么你需要知道以下几点
创新基地虽然是一个组织,更是一个大家庭,创新基地里面的学长学姐,即使技术超群,牛人一个,他们也不会以一副高傲的样子对待你。相反,他们很热情,对学弟学妹提出的问题都很有耐心的讲解。
创新基地是一个提升自我的平台,面对未来感到迷茫的你,或许会从这个大家庭里面找到一丝丝灵感和方向,如果你肯下功夫肯努力,将大大有利于你未来的就业。
创新基地可利用资源丰富,配备有台式电脑,以及关于编程方面的大部分书籍,不来好好利用一下,你就亏了。
我们七院创新基地,是属于桂林电子科技大学下的科技组织,所以招新对象仅限于桂林电子科技大学数学与计算科学学院的同学。当然,非常欢迎其他学院的同学们和我们交流学习编程技术,共同进步。
基地冬暖夏凉哦~~~~
数学与计算科学学院创新实践基地管理制度¶
指导老师根据成员学习情况分配学习任务,成员应完成本部门相应指导老师规定的学习任务。
由各部门部长定期组织本部门学习心得分享。
由创新创业基地负责人至少每两个月组织开展1次创新沙龙。
每学期期末定向对创新创业基地成员进行考核,考核内容包括指导老师布置的学习(项目)任务,平时参加会议出勤情况等。
严禁将创新创业基地电脑带出基地,严禁擅自拆卸使用他人电脑。
最后离开创新创业基地者应当注意关好门窗、切断电源。
基地公告¶
数学与计算科学学院第二届程序设计竞赛¶
一、活动目的¶
为提高学院科技创新活动氛围,推动学院科技创新活动的发展,引导同学们学习掌握计算机与互联网知识,提高同学们将所学理论转化为实际应用的能力,同时为了给同学们提供一个了解并参与程序设计竞赛的平台,数学与计算科学学院创新创业实践基地将面向学院全体学生举办“数学与计算科学学院第二届程序设计竞赛”。
二、主办单位与负责老师¶
主办单位:数学与计算科学学院创新创业实践基地
学院负责老师:毛睿 联系方式:15677359715
三、参赛形式¶
参赛对象:数学与计算科学学院全体学生
本次比赛为个人赛,主要考察同学们的编程能力(数据结构和算法基础能力)
四、竞赛环境¶
竞赛语言:C、C++、Java、Python
开发环境:Dev-C++、IDLE、Eclipse
评判工具:使用开源OJ搭建的七院在线评判系统
比赛机器操作系统:Windows 7
五、竞赛纪律¶
1、参赛选手严禁携带任何纸质资料
2、参赛选手不得携带任何通讯工具,不能携带任何电子产品
3、比赛严禁作弊,如若发现代码雷同,立即取消参赛资格
六、竞赛规则¶
参赛时间:11月18日19:30——21:30(06406),时长2小时
比赛题目:问题来自数论、图论、动态规划、数据结构、概率论、计算几何、搜索、贪心、模拟等
排名方式:按照解题得分、解题数、解题正确率进行排名
参赛选手可能收到的OJ反馈信息包括:
Pending & Judging : 您的解答将很快被测评,请等待结果
Compile Error : 无法编译源代码,点击链接查看编译器的输出
Accepted : 解题方法是正确的
Wrong Answer : 程序输出结果与判题程序的答案不符。
Runtime Error : 程序异常终止
Time Limit Exceeded : 程序使用的 CPU 时间已超出限制
Memory Limit Exceeded : 程序实际使用的内存已超出限制
七、奖励设置¶
1、一等奖、二等奖、三等奖:
按照有效参赛选手(至少提交过一道题目)的10%、20%、30%颁发奖状和礼品
2、最佳“新生”奖
排名最高且解决的问题数大于一道的大一新生,颁发奖状
八、报名方式¶
1、填写在线报名表:
2、比赛交流QQ群:924770329
3、报名时间段:2019年11月3日——2019年11月17日
九、备注说明¶
1、本次比赛最终解释权归数学与计算科学学院创新创业实践基地所有。
2、颁奖时间地点赛后通知
第一期假期试炼¶
前言¶
考完试了,是不是贼爽?🙂放假了学习也不能忘啊,我就不信你们天天玩游戏或者出去旅游等等xxx。
2019年秋季学期我们没有较大的考核也没有签到制度,就算是没有这些,仍有一部分同学坚持来基地学习,当然整天来这里吹水的不算学习。(接下来开始贩卖焦虑,(^_^))
对于大二的同学,你们应该继续深入你们所感兴趣的领域,坚定一个领域学3、4年。不会亏!!!对于那部分学习方向不明确的同学,偷偷告诉你们,你们和其他人的差距正在进一步拉大(或许你没有真正认识到。为什么?因为在这里你们,你们没有真正的“老师”带着你一步一个脚印的学,基本上全靠的是你自己。同时,你们可能自认为我在广泛的涉猎知识,我也在进步啊!其实不然,你们这个阶段所接触的东西太过粗浅,相比于那部分深入领域学习的同学,你们没有真正碰上有难度的挑战,思想压根得不到有力磨练,而且你们能真正动手实践的地方真滴少。希望你们能明确方向,不要乱动。多多动手实践,引用耗子叔的一句话:有些东西你需要亲身经历和体会才知道,而不是光听别人怎么说。
对于大一的同学,你们能够来基地自主学习的同学真的很少,也有可能你们在图书馆或者教室学,宿舍这种地方就不要“待”了。如果你们了解过其他院和你们同一级的,希望你们能认识到你们和其他院同一级比差距很大。加把劲,趁着假期,好好想想你们以后想做什么,希望你们大一的时候就能够明确方向,其他科协也有很多学习方向飘摇不定的同学,你确定好方向,拉近差距甚至甩开他们不是三两下😱。希望下学期,你们有个固定来基地学习的时段,哪怕每天一两个小时,长期积累下来,那也会有质的飞跃。
前言的最后,偷偷告诉你们,下学期,你们可能会很痛苦,我们会有两次考核。第一次为开学第一个月(估计2月29日),第二次大概在5月初。第一次的主要形式如下:
学习总结PPT讲解,可以放上你在做的东西(大一)
项目展示<项目展示可以是正在做的,但是还没有完成,部分功能可展示>,开发时注意解耦,松耦合(大二)
某个知识点的深入理解和实践的分享,比如SQL优化实践,优化前后效率对比、Git原理剖析、算法模型讲解(实现与应用)、TDD(Test-driven development)、GitHub Actions应用、危险的指针(the dangerous pointer)等等,PPT+代码片段(大二)
第二次估计为项目展示(成品),到时候再说✨
By the way,还没有加GitHub组织的同学,在这个Issue里留言,留下GitHub注册邮箱,owner会发邀请加入的邮件给你们!!!
issue: https://github.com/seven-innovation-base/SphinxDOC/issues/7
正题¶
非正题扯完了,说正事。这个假期,我们玩点有意思的,主题名为:“AR1SR2W1W2”。
A:算法(Algorithms),🖊做一道中等难度及以上的算法题或者学习一个有难度的算法,写下你的解题思路(多个)、想法、算法原理,把文章分享出来,文章可发表在各大技术平台或者你的个人博客、GitHub Project README
R1:复审,检查(Review),Review一篇英文技术文章,把它翻译出来(跑通作者的代码,附带你的个人想法),然后把你整的以文章的形式记录分享出来👍
S:分享(Share),📚写一篇文章,分享你进入大学到现在的学习感悟或者分享你的技术学习路线,脑图+白话文🎹
R2:阅读(Read)👀,读一篇有深度的技术文章或者读一本科普书(比如人类简史),写下你的感悟,同样的把你的感悟以文章的形式分享出来
W1:看(Watch),看一场技术主题演讲的视频,认识下大佬,以文章的形式写下你的感悟分享出来。不知道有哪些开发者技术活动,可以看下这篇文章:《权威发布丨SegmentFault 思否 2019 中国最受开发者欢迎的技术活动》,这些活动的视频和PPT大部分都会放出来,GitHub、B站或者官网应该能找到🍀
W2:写(Write),写篇技术文章分享出来,主题随意,你们懂得😀
以上,随便选个两三个或者全部,我会邀请学长学姐给你们打分。拒绝Copy、Paste。我们知道,网络的力量是巨大的,文字的力量也是巨大的,要对你们自己写的东西负责哦(⊙o⊙)。🤝请大家将文章提交到这里:https://github.com/seven-innovation-base/articles/issues/1
活动时间段为:2020年1月1日-2020年2月29日
问题来了,这么骚,有没有奖励,有的喂!!!请看下面:
一等奖:《Linux就该这么学》纸质书一本+有基地logo的商务记事本一本
二等奖:U盘+有基地logo的商务记事本一本
三等奖:带有基地logo的商务记事本
结语¶
最后,祝大家2020快乐,诚挚的邀请你们加入本文档的编辑与维护工作,详情请阅读文档项目的README
如果还不会Git的话,到练习仓试手👉Git2Github-practice,Git是现阶段必修的一门技术,多了解下GitHub,开源正经历着前所未有的繁荣,当你迈出第一步的时候,你就比那些踌躇不定的同学强了
Cloudys
2020年1月2日
各部门简介¶
算法研发部¶
简介¶
部门以培养成员扎实的算法能力和编程思想为目标,提升每个成员的算法优化能力、逻辑思维能力和抽象建模能力,为今后的算法比赛和就业做准备。
我们学什么?(๑•ㅂ•́)و✧
C/C++
C++ STL
基础算法
排序:快排、归并、计数
搜索:回溯、递归、剪枝
图论:最短路径、最小生成树、网络流建模
动态规划:背包问题、最长子序列、计数问题
基础技巧
分治
倍增
二分
贪心
数据结构
数组与链表
栈与队列
树与图
哈希表
堆:大小根堆、可并堆
字符串:字典树、后缀树
应用软件研发部¶
简介¶
部门以培养计算机技术领域优秀的工程师为目标,学习方向广泛。主要有:Web 开发、移动端开发(Android、iOS、Hybrid)、PC 客户端开发、DevOps、云计算、云原生等等。
对部门成员的希冀¶
希望各成员能通过理论和实践相结合的方式,巩固和拓展学到的知识,打好编程基本功
兴趣为导,$ 为辅,本科阶段深度耕耘一个技术领域2-3年
开源正经历着前所未有,希望各成员积极参与一些优秀的开源项目的文档贡献和代码贡献
Slogan: 只会侃侃而谈却做不出来、做不到就是个屁!!!
技术生态一览¶
通用:Git-Version Control、GitHub、Basic Terminal Usage、Data Structure & Algorithm、Semantic Versioning、SSH、HTTP/HTTPS and APIs、Character Encodings、Search、Design Patterns
Web方向
移动端开发(Android、iOS、Hybrid)
资料参考:极客时间开源项目~程序员技能图谱
DevOps
DevOps元素周期表

DevOps Tools¶
云原生技术生态
CNCF Cloud Native Definition v1.0

landscape¶
landscape来源:cncf/landscape
大数据技术与分析部¶
简介¶
部门是在统计学成为一级学科及大数据和人工智能新时代的背景下建立起来的。部门以培养优秀的大数据工程师、数据分析师、大数据科学家为目标。打好扎实的数学与统计基础,掌握数据挖掘的基础理论、核心算法、关键技术及软件系统,熟悉海量复杂数据的组织、处理、分析、挖掘和可视化等问题。
我们学什么、要了解什么:
编程语言
Python
Java
R
数据分析挖掘
SPSS
SAS
数理统计基础
大数据通用处理平台
Spark
Hadoop
机器学习基础
数据库技术
分布式存储、调度技术
基础算法
信息安全部¶
简介¶
信息安全部研究范围较广,主要涉及木马编程、网络渗透、逆向工程、代码审计、密码学及社会工程学等方向。部门不同方向的成员可以通过相互组队,参加各大CTF夺旗赛及信息安全比赛。
木马编程:木马编程主要学习C/C++、Windows编程及MFC等,打好编程基础后学习Socket编程、 DLL动态调用,尝试去写键盘记录等程序,再添加文件管理、视频监控、音频控制等功能,最后解决自启动、过UAC、免杀等问题,最终开发出一款成熟的远控。
网络渗透:web渗透测试需要熟悉网站、数据库、操作系统、计算机网络、脚本编程等方面的知识,主要是针对网站或网络主机服务器群组,利用相关漏洞进行攻击,获取数据,得到webshell,甚至拿下整个内网。学习渗透测试,要有一定的编程能力,熟练使用各种工具,时刻关注最新漏洞,了解漏洞的基本原理及利用方法,高效率,多实践。
逆向工程:逆向工程主要通过阅读软件的反汇编代码来推断其数据结构、体系结构和程序的设计思路。学习逆向要有良好的编程基础,要精通C/C++、汇编语言、二进制、算法和数据结构以及各种调试工具。
代码审计:代码审计也叫白盒测试,一般是对网站源码进行分析,从而寻找代码中的bug。主要学习PHP、JSP、.NET等语言以及各种数据库,需要熟悉常见web漏洞原理,并且要有较强的逻辑分析能力和代码阅读能力。
职业体系(非正式)¶
Web安全测试
Windows :对网站、业务系统进行安全评估测试(黑盒、白盒测试);对各类系统进行安全加固;对安全事件进行响应,清理后门,根据日志分析攻击途径…
Android :负责移动应用安全测试和安全事件应急响应;负责移动应用安全平台建设;参考 Web安全 Windows
Web安全研发 互联网运营平台、业务安全平台等系统的建设和开发;对安全产品的易用性改进和Web研发技术优化;根据需要开发安全辅助工具或平台;参与安全系统的需求分析、设计、编码等开发工作;维护现有的安全程序与系统…
病毒分析 病毒样本分析及处理;木马编程…
逆向工程
Windows : 参与漏洞挖掘、分析和利用技术研究;分析高危漏洞原理和利用技巧,撰写相关技术总结文档;挖掘浏览器、Office、Adobe Reader、flash等客户端软件以及网络协议常见漏洞;研发相应的漏洞挖掘和分析的一体化框架平台;恶意程序分析以及其他程序内部实现逻辑分析…
Android :开发安卓平台加固框架;参考 逆向工程 Windows
非正式划分,如想了解更详细标准,可以浏览 各大招聘网站或相关企业官网 的招聘需求
学习方法¶
拼图法:组织管理学习目标,建立知识技能体系,模块式完成目标。
以Web安全测试为例,这是该职业体系的一个基本技能树:BUGBANK-SKILLS > 以目标为导向,一个模块一个模块的完成学习任务,在学习过程中又根据需求自驱动的学习其他相关知识。
金句良言¶
重要
1、多花时间做事情,少花时间说服别人。
2、学习不是为了找到答案,而是为了找到方法。
3、技术广度是技术深度的附属品。
4、选择对了合适的路,比光顾着赶路要重要得多。
5、要应付并通过面试并不难,但是,千万不要应付你的人生。
来自陈皓(左耳朵耗子)、CoolShell
内部文章¶
StringBuilder的高性能使用方式总结author: CkaiGrac¶
一、设置合理的初始长度¶
在StringBuilder的源码中,有一个char[ ]数组,这个就是用来存储字符的。
//AbstractStringBuilder.java
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
而count统计字符数量。当直接new StringBuilder();
时,传递到父类的默认大小(capacity)为16,也就是默认状态下char[
]数组的长度为16。 来看一下append方法:
//AbstractStringBuilder.java
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
从上述源码中,可以看到append方法接收String类型的参数,然后调用ensureCapacityInternal()
方法,在这个方法里面我们可以看到做了一个判断,最小容量minimumCapacity
是否比数组的长度大,而最小容量的大小是len+count
。
数组长度大于最小容量的话就要扩容,Arrays.copyOf(value,newCapacity(minimumCapacity));
这段代码执行数组拷贝。
从Array.copyof(char[] original, int newLength)
可以看到第二个参数是数组新的长度,而这个新的长度来自newCapacity()
的返回值。
在newCapacity()
中我们看到int newCapacity = (value.length << 1) + 2;
,char[
]数组的长度左移一位再加2,也就是长度x2+2。
从上面的分析中就可以看到数组的扩容是成倍的,如果StringBuilder不设置合适的初始长度就会进行扩容,造成一点内存损失。
二、重用StringBuilder¶
public class MyClass{
private static Field stringBuilderValueField;
private static Boolean needGetField = true;
//ThreadLocal适用于变量在线程之间隔离,方法之间共享
private static ThreadLocal<StringBuilder> sbBuffer = new ThreadLocal<StringBuilder>();
//重用StringBuilder的例子
public static StringBuilder obtainStringBuilder(){
StringBuilder stringBuilder = sbBuffer.get();
if (stringBuilder == null) {
System.out.println("stringBuilder为空");
stringBuilder = new StringBuilder(1024 * 10);
sbBuffer.set(stringBuilder);
} else {
System.out.println("stringBuilder不为空");
stringBuilder.delete(0, stringBuilder.length());
}
return stringBuilder;
}
}
//调用方式为
StringBuilder stringBuilder = MyClass.obtainStringBuilder();
StringBuilder stringBuilder2 = MyClass.obtainStringBuilder();
stringBuilder.append(.....);
stringBuilder2.append(.....);
从上述的代码中可以看到,obtainStringBuilder()
方法返回一个StringBuilder对象,方法中首先从ThreadLocal中取StringBuilder然后判断是否为空,如果为空的话则初始化一个StringBuilder对象,大小根据实际情况设置。否则的话就清空StringBuilder的内容来重用。
对于同一个线程来说,每次调用obtainStringBuilded()
方法拿到的都是同一个StringBuilder对象。但是对于不同线程来说,两个线程之间的StringBuilder对象是相互独立的,没有任何关系。
这样的好处是减少申请内存的频率,降低GC(垃圾回收)的发生
win10自带虚拟机Hyper-V¶
教你如何使用win10自带虚拟机Hyper-V¶
按win+pause break快速打开控制面板的系统和安全中的系统,点击控制面板

在控制面版中,打开程序组件,选择程序与功能。点击启动或关闭windows功能。

找到Hyper-V,打勾(注意win10家庭版时没有Hyper-V)

勾选后,点击立即重启

开机后找到Hyper-V,打开程序

虚拟机网络配置¶
打开Hyper-V,在右侧操作列表中点击“虚拟交换机管理”,打开虚拟交换机管理器

选择“新建虚拟网络交换机”,在虚拟交换机类型列表中选择“外部”,点击“创建虚拟交换机”,创建一个虚拟交换机,输入虚拟交换机的名称和说明,为虚拟交换机选择一个网络适配器(即物理网卡),点击“确定”。

等待应用更改
在Hyper-V管理器中,选择虚拟机,点击右侧操作列表中的“设置”,修改虚拟机配置。
在虚拟机设置界面,点击“网络适配器”,选择虚拟交换机,点击确定,这样就配置好了虚拟机的网络连接。
这样就完成里虚拟机的网络配置了;
开始创建虚拟机了¶
下载虚拟机需要的镜像
推荐win10镜像链接:https://msdn.itellyou.cn/
推荐Linux链接:https://ubuntu.com/download/desktop/thank-you?country=CN&version=18.04.3&architecture=amd64#download
将下载成功的镜像放在电脑上的一个文件夹中以备后用。
开始创建 1)点击新建虚拟机
2)设置你的虚拟机的名称
3)指定代数,我选择的是第一代,继续选择下一步
4)网络配置,选择我们刚刚设置的网络名称
5)从我们的文件夹中选择镜像
6)后续就是下一步,完成。 示意图:
7)这里显示已经创建好了,然后右键选择启动该虚拟机(有点小慢)。启动之后右键选择连接开始自动安装系统,注意选择语言,否则安装之后是英文,如果对英文有点感冒的话,这里就修改下,要不然安装好之后有需要在设置里修改。
安排:¶
选择语言点击install ubuntu,之后就是下一步、下一步。
说明:1.因为是虚拟机所以可以清空虚拟U盘里的东西,这样对你现有的电脑文件没有影响的 2. 如果重启的时候出现错误记得关闭虚拟机,然后在开启。
进制转换题目解析¶
一、题目描述¶
我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式。例如:123可表示十进制为1x10^2+2x10^1+3x10^0这样的形式。 与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为 0,1,….R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。 在负进制数中是用-R作为基数,例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:
110001=1(-2)^5+1(-2)^4+0*(-2)^3+0*(-2)^2+0*(-2)^1+1*(-2)^0
设计一个程序,读入一个十进制数和一个负进制数的基数,并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,…,-20}。
输入
每个测试文件只包含一组测试数据,每组输入两个整数,第一个是十进制数N(-32768<=N<=32767);第二个是负进制数的基数-R。
输出
对于每组输入数据,输出此负进制数及其基数,若此基数超过10,则参照16进制的方式处理。
输入样例1
3000 -2
输出样例1
30000=11011010101110000(base-2)
二、问题分析¶
涉及知识点: - 十进制数转化成二进制或者八进制或者16进制。 - 短除法。 - 数字的求模取余。
注意:一个负数表示成二进制的方法可以先求它相反数的二进制数,然后取反码,最后取补码,所得结果就是负数的二进制形式。不知道什么是原码、补码、反码的不要紧与解本题没有太大关系。
比较难为人的事情是,题目中介绍了什么是二进制与十六进制,但要我们求解一个负二进制到负二十进制。
简单介绍一下什么是短除法 短除法是十进制转换成任意进制形式的计算方法。十进制数转换成任意进制只要用短除法除对应的码数就行了,比如,十进制数1500转换成二进制形式应该用短除法除2,如果要转成十六进制那应该短除16,转成二十进制应该短除20。 十进制数13转换成二进制的计算过程:
2 |__13__ 1
2 |__6__ 0
2 |__3__ 1
1
所以13的二进制形式是1101,注意要从下往上写。 短除法右边的值是余数,13除2等6余1。
十进制数-15转换成负二进制的计算过程: 这个过程需要特别注意!
错误的运算:
-2 |__-15__ -1
7
-1 = -15-(-2x7)
发现短除右边余数是-1,显然错了,二进制形式余数只能为0或1,同理十六进制余数只能为0~15
正确的运算:余数为负数时,商应该+1,使得余数不为负数。
-2 |__-15__ 1
-2 |__8__ 0
-2 |__-4__ 0
-2 |__2__ 0
-2 |__-1__ 1
1
1 = -15-(-2x8) = -15+16
0 = 8-(-2x-4)
0 = -4-(-2x2)
0 = 2-(-2x-1)
1 = -1-(-2x1)
所以-15的负二进制为110001。 多问就会了。
所以我们把要做的事情分为以下几步: - 首先进行求模运算,判断余数是否为负数 - 如果余数为负数,则商+1,再求余数,把余数记录下来 - 如果余数不为负数,正常求模运算,把余数记录下来
为了方便转换,定义一个字符数组charList,用于十六进制往后余数对应的字母A、B~F。
Java代码实现:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();// 手动输入
int base = sc.nextInt(); // 手动输入
int num_copy = num;
int quotient = 0;// 商
List<Character> list = new ArrayList<>();// 动态数组来存,因为不知道转换后有几位
char[] charList = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J' };
while (num != 0) {
int mod = num % base;
if (mod < 0) {
quotient = num / base + 1;
mod = num - quotient * base;
list.add(charList[mod]);
num = quotient;
}else{
mod = num % base;
num /= base;
list.add(charList[mod]);
}
}
Collections.reverse(list);//数组倒序
StringBuilder sb = new StringBuilder(256);
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
System.out.println(num_copy+"="+sb.toString() + "(base" + base + ")");
sc.close();
}
}
C代码实现:
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 0;
int base = 0;
scanf("%d", &num); //手动输入
scanf("%d", &base); //手动输入
int num_copy = num;
int quotient = 0; // 商
char *list; // C语言中的动态数组
list = (char *)malloc(256 * sizeof(char));
char charList[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
int i = 0; //计数器
while (num != 0) {
int mod = num % base;
if (mod < 0) {
quotient = num / base + 1;
mod = num - quotient * base;
list[i] = charList[mod];
num = quotient;
i++;
} else {
mod = num % base;
num /= base;
list[i] = charList[mod];
i++;
}
}
int k = 0;
printf("%d=", num_copy);
for (int i = 256; i >= 0; i--) {
if (list[i] == NULL) {
continue;
}
printf("%c", list[i]);
}
printf("(base%d)", base);
return 0;
}
几种常见的博客搭建资源汇总¶
前言¶
本文给出了几种常见的个人网站(博客)搭建方式的教程资源。官方文档为主,B站视频教程为辅。比较适合喜欢折腾的同学。不喜欢折腾的可以直接使用CSDN博客、博客园、语雀等提供的服务。别忘了博客的初心是记录。
常见的个人博客、网站、知识库搭建方式如下:
动态管理系统需要使用服务器部署,因为这些系统的数据大都存放在数据库。现今大部分的云服务商(阿里云、AWS、腾讯云等等)大都提供了一个月甚至一年的服务器试用期。
依赖静态站点生成器生成的网站不仅可以部署在服务器上,还可以利用一些免费的站点托管服务进行托管,比如GitHub、Coding、Gitlab等提供的Pages服务和Read the Docs的文档托管服务。深入折腾的同学还会接触到一些CI/CD工具链、SEO技巧等等。
热门方式¶
1.WordPress搭建个人博客¶
首先根据维基百科来介绍一下WordPress:
步骤:
注册域名
创建VPS(虚拟专用服务器,即需要购买服务器)
解析域名
绑定域名
上传配置文件
安装使用
具体详细操作详见如下文档和视频:
2.Typecho 搭建个人博客¶
首先介绍一下Typecho:
Typecho是一个基于PHP的简洁的开源博客程序。它使用多种数据库(MySQL、PostgreSQL、SQLite、MariaDB)储存数据,在GNU GPLv2许可证下发行
搭建步骤:
注册域名
购买vps
解析域名
环境安装
安装typecho
具体详细操作流程可参照以下文章和视频:
9.docsify搭建个人文档¶
常识须知¶
入门必知¶
算法:解决某个问题的计算方法、步骤。《如何通俗易懂的解释什么是算法》
CLI(Command Line Interface):CMD、Windows PowerShell、Bash、…
注解
通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,在现在的图形用户界面的操作系统中,通常都保留着可选的命令行界面。虽然现在许多计算机系统都提供了图形化的操作方式,但是却都没有因而停止提供文字模式的命令行操作方式,相反的,许多系统反而更加强这部分的功能,例如Windows就不只加强了操作命令的功能和数量,也一直在改善Shell。Programming的方式。而之所以要加强、改善,自然是因为不够好;操作系统的图形化操作方式对单一客户端计算机的操作,已经相当方便,但如果是一群客户端计算机,或者是24小时运作的服务器计算机及路由器、交换器等电信设备,图形化操作方式有时会力有未逮,所以需要不断增强命令行界面的脚本语言和宏语言来提供丰富的控制与自动化的系统管理能力,例如Linux系统的Bash或是Windows系统的Windows PowerShell。- 引自维基百科
注解
RFC ,请求意见稿(英语:Request for Comments,缩写:RFC)是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,以编号排定。当前RFC文件是由互联网协会(ISOC)赞助发行。 RFC始于1969年,由当时就读加州大学洛杉矶分校(UCLA)的斯蒂芬·克罗克(Stephen D. Crocker)用来记录有关ARPANET开发的非正式文档,他是第一份RFC文档的撰写者。最终演变为用来记录互联网规范、协议、过程等的标准文件。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。
信息安全相关¶
CTF 夺旗赛
注解
CTF(Capture The Flag,夺旗赛)是一种流行于网络安全技术人员之间的一种信息安全技术竞赛。其前身是传统黑客之间网络技术比拼的游戏,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。起源于1996年第四届DEFCON。现在已成为全球范围网络安全圈流行的竞赛形式。
通常CTF分为三种赛制:解题赛(Jeopardy)、攻防赛(Attack-Defence)和混合赛。
竞赛模式基本分为解题模式、攻防模式和混合模式。大多题目的内容基本包括web安全,密码学、逆向、二进制安全编程类题目等国内外有很多CTF比赛。
解题赛是线上赛通常采取的赛制,题目通常分为多个类型,如Web,Forensic(取证),Crypto(密码学),Binary(二进制)等。团队或个人可以通过解题获得一串具有一定格式的字符串,也就是flag。将flag提交到竞赛平台可以获得积分。题目的难度越大,分值就越高。当比赛结束后,得分最高者胜出。
攻防赛是另一种有趣的赛制,常见于线下决赛。攻防赛中,每个队伍都会被分配一台主机或虚拟机,称为gamebox,队员可以通过网络连接到gamebox。而所有队伍的gamebox通过内网连接在一起。每个队伍的gamebox上都运行着多个相同的服务。参赛队伍需要挖掘服务的漏洞,然后攻击其他队伍的服务来获取flag,并提交给计分服务器来获取积分。与此同时,参赛队伍还需要修补自身服务中的漏洞来防止丢分。攻防赛不仅考验了参赛选手的技术水平,还考验了参赛者的体力,因为通常参赛者需要连续混合赛可能采取解题赛和攻防赛的混合模式,也可能是其他形式。
CTF Wiki
大数据技术相关¶
软件开发相关¶
模块化程序设计、分而治之
模块化程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。
高内聚、低耦合
高内聚:模块内各元素关联性强,紧密程度高。
低耦合:让每个模块,尽可能的独立完成某个特定的子功能。
高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。
文档渲染测试¶
Markdown 语法渲染测试¶
CommonMark风格,parser->commonmarkpy、recommonmark
什么是 Markdown¶
Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题,分割不同的段落,粗体 或者 斜体 某些文字,更棒的是,它还可以
1. 制作列表¶
I
II
III
IV
V
Vi
2. 高亮一段代码¶
@requires_authorization
class SomeClass:
pass
if __name__ == '__main__':
# A comment
print 'hello world'
5、更多精彩¶
你只需使用键盘专注于书写文本内容,就可以生成印刷级的排版格式,省却在键盘和工具栏之间来回切换,调整内容和格式的麻烦。Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。