为什么很多编程语言中数组都从0开始编号
为什么很多编程语言中数组都从0开始编号从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。
如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址。
a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址就是
1a[k]_address = base_address + k * type_size
我们拿一个长度为 10 的int 类型的数组int[] a = new int[10]来举例。
计算机给数组 a[10],分配了一块连续内存空间 1000~1039,其中,内存块的首地址为 base_address = 1000。
计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。
当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:
a[i]_address = base_address + i * data_type_size //data_type_size 表示数组中每个元素的大小。 但是,如果数组从 1 开始计数,那我们计算数组元素 a ...
【2022暑期训练-1】7-7 天梯赛座位分配
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。
输入格式:输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。
输出格式:从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。
输入样例:1233 4 2
输出样例:123456789101112#11 4 7 10 13 16 1 ...
【2022暑期训练-1】7-6 点赞狂魔
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。
输入格式:输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F1⋯FK”,其中Name是不超过8个英文小写字母的非空用户名,1≤K≤1000,Fi(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从 1 到 107 编号。数字间以空格分隔。
输出格式:统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个,题目保证这样的用户没有并列。若不足3人,则用-补齐缺失,例如mike jenny -就表示只有2人。
输入样例:1234565bob 11 1 ...
【2022暑期训练-1】7-5 树种统计
随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
输入格式:输入首先给出正整数N(≤105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。
输出格式:按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。
输入样例:12345678910111213141516171819202122232425262728293029Red AlderAshAspenBasswoodAshBeechYellow BirchAshCherryCottonwoodAshCypressRed ElmGumHackberryWhite OakHickoryPecanHard MapleWhite OakSoft MapleRed OakRed OakWhite OakPoplanSassafrasSycamoreBlack WalnutWillow
输出样例:123456789101112131415161718192021222 ...
【2022暑期训练-1】7-4 集合相似度
给定两个整数集合,它们的相似度定义为:N**c/N*t×100%。其中Nc是两个集合都有的不相等整数的个数,Nt*是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式:输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤104),是集合中元素的个数;然后跟M个[0,109]区间内的整数。
之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。
输出格式:对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
输入样例:123456733 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3
输出样例:1250.00%33.33%
思路:用set记录出现的每一个元素,之后判断相同元素的数量,不同元素的数量即为 两个集合元素总数 - 相同元素数量。之后判断相似度。
代码:1234567891011121314151617181920212 ...
【2022暑期训练-1】7-3 素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有d*n*是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:输入在一行给出正整数N。
输出格式:在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:120
输出样例:14
思路:穷举a到b之间的每一个素数,同时记录前一个素数,判断两个素数之间差值是否为2.
代码:1234567891011121314151617181920212223242526272829#include<bits/stdc++.h>using namespace std;int prime(int x){ for(int i = 2; i <= sqrt(x);i++){ if(x % i == 0) return 0; } return 1;}int main(){ int n; ...
【2022暑期训练-1】7-2 h0039. 平方数
markdown 文章内容
平方数是一个整数,它的平方根也是一个整数。例如1、4、81是一些平方数。给定两个数字a和b,请你在a和b之间(包括a和b)找出有多少平方数?
输入格式:输入文件最多包含201行输入。每一行包含两个整数a和b (0<a≤b≤100000)。输入以包含两个零的行结束。这一行不用处理。
输出格式:每一行输入产生一行输出。这一行包含一个表示在a和b之间有多少个平方数(包括a和b)。
输入样例:1231 41 100 0
输出样例:1223
思路:穷举从a到b之间的每一个数,判断该数的正平方根是否为正整数。
代码:12345678910111213141516#include<bits/stdc++.h>using namespace std;int main(){ int a,b; while(cin >> a >> b && a || b){ int res = 0; for(int i = a; i <= b; i++){ ...
【2022暑期训练-1】7-1 最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:输入在一行中给出两个正整数M和N(≤1000)。
输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:1511 292
输出样例:173 2044
思路:利用辗转相除法求最大公约数,同时最小公倍数为两数相乘除以两者的最大公约数。
代码:#include<bits/stdc++.h>using namespace std;
int main(){ int m,n; cin >> m >> n; int r; r = m % n; int x; x = m * n; if(r == 0) cout << n << " " << x / n; else{ while(r != 0){ m = n; n = r; r = m % n; } ...
竞赛中常见的影响速度的几点
竞赛中常见的影响速度的几点在很多情况下,题目有思路但是会TLE,基本上都是卡输入输出,故在此总结一下,影响程序运行速度,不过建立在时间复杂度正确的情况下。
cin/cout 解绑这是一个初学者基本上都会遇到的坑,原生的cin/cout的速度非常慢,因为要和scanf/printf进行同步,所以需要加上。
1std::ios::sync_with_stdio(false);std::cin.tie(0);
注意解绑后,不能再使用scanf和printf,以及getchar
解绑后的cin/cout的速度比scanf快,cin输入的数据类型在编译时期就会确定,而scanf则是在运行时解析字符串,即以下代码
1234567int main() { char s[20]; cin >> s; int n; scanf(s, &n); cout << n << endl;}
endlendl在使用时不仅仅是换行,还会清空缓冲区,速度上可能比”\n”换行慢了10倍。
所以大家完全可以加上
1#define endl "\n"
...
day01 c++中STL库的简介及使用说明
今日份知识分享:c++中STL库的简介及使用说明作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。
初识STL:解答一些疑问 一个最关心的问题:什么是STL
“什么是STL?”,假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,如果你在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信你对STL的认识,将会愈加清晰、准确和完整。不过,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:)
不知道你是否有过这样的经历。在你准备着手完成数据结构老师所布置的家庭作业时,或者在你为你所负责的某个软件项目中添加一项新功能时,你发现需要用到一个链表(List)或者是映射表(Map)之类的东西,但是手头并没有现成的代码。于是在你开始正式考虑程序功能之前,手工实现List或 ...