当前位置:首页 > 第五届华为“创新杯”编程大赛试题与答案
2013年华为周编程大赛
考试说明: 1、本大赛的所有输入都从标准输入 stdin(比如在C语言中用scanf或其他能从标准输入获取数据的库函数)获取输入,系统获取答案的方式是从标准输出获取考生程序的输出(比如在C语言中用printf,或其他可以往标准输出输出信息的库函数),输出的信息只能包含答案,不能包含多余的其他打印信息,否则会导致答案错误。 2、使用Java答题时,类名必须为“Main”;
3、使用C/C++答题时,尽量使用ANSI标准的数据类型和函数; 4、代码中不允许有任何文件操作;
5、阅卷时采用自动执行测试用例进行评分,测试用例不对考生公开
6、阅卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。
两者相同则得分,不同则不得分。
7、提交答案时请提交全部代码,包括main函数和所有子函数;把代码保存成 “姓名_手机号_试题编号.txt “
比如 :
李明_123456789_1.txt 李明_123456789_2.txt 李明_123456789_3.txt
把保存后的文件统一打包成 test.rar ,然后把 test.rar提交到系统就可以了
总共包含3道题目,每道题目的难度不一样,请按题目说明进行答题
【考试的注意事项】
试题1的详细说明请点击这里
试题2的详细说明请点击这里
试题3的详细说明请点击这里
题目描述
在磁盘阵列里,RAID5是一个很基本的数据安全和成本以及性能之间兼顾的技术方案,它是把数据和校验信息均匀的分散到的阵列的各个磁盘
上,阵列的磁盘上既有数据,也有数据校验信息,数据块和对应的校验信息会存储于不同的磁盘上,当一个数据盘损坏时,系统可以根据同一
带区(下图中的D1D2D3P1)的其他数据块和对应的校验信息来重构损坏的数据。如下所示为数据D1D2D3D4D5D6D7D8D9D10D11D12即其相应校验
信息P1P2P3P4在阵列中的分布(D为数据,P为校验信息,每一列为一阵列磁盘,每一行为一带区):
D1(0x1a) D2(0x2a) D3(?) P1(0x6a) D4(0x4a) D5(0x5a) P2(?) D6(0x6a) D7(0x7a) P3(0x6a) D8(?) D9(0x9a) P4(0xad) D10(0xaf) D11(?) D12(0xac)
系统已经把数据信息{ D1(0x1a), D2(0x2a), D3(?),D4(0x6a), D5(0x5a) ,D6(0x6a),D7(0x7a), D8(?),D9(0x9a), D10(0xaf), D11(?)
,D12(0xac)}及其异或校验码信息{P1(0x6a),P2(?),P3(0x6a), P4(0xad)}按照raid5技术如上依次存储在四个阵列磁盘中,但不幸的是部分磁
盘数据已经损坏,如上图所示第3列(即第3块磁盘),请将其同一带区中丢失的信息恢复出来。
注意:数据校验信息是通过异或计算得来的。 例如:
其中“?”表示待恢复的数据和校验码信息。在输入数据时为方便操作,“?”用0xff表示,测试用例中会保证其它正常数据不会出现0xff。以上输入信息变为{ 0x1a, 0x2a, 0xff, 0x6a, 0x4a, 0x5a, 0xff, 0x6a, 0x7a, 0x6a, 0xff, 0x9a, 0xad, 0xaf, 0xff, 0xac }
丢失数据和校验信息的恢复:D3=0x5a, P2=0x7a, D8= 0x8a, D11=0xae 输入
以空格隔开的16进制数字(数据共计16个,如上图中所示规模) 输出
以空格隔开的恢复后的数据和校验信息
样例输入
0x1a 0x2a 0xff 0x6a 0x4a 0x5a 0xff 0x6a 0x7a 0x6a 0xff 0x9a 0xad 0xaf 0xff 0xac 样例输出
0x5a 0x7a 0x8a 0xae
难度:1级
题目描述
随着大数据时代的到来,也就意味着越来越多的数据需要被存储与分析。10年前,市场上主流的硬盘容量也就20GB,而今天,硬盘容量已达到
TB级别。在一些大型企业的数据中心,购买的存储容量多达几十,上百个PB,甚至达到EB级别。但用户在使用过程中,如果将EB级的容量使用
MB呈现,将带来极大的困扰,比如华为网盘给你分配了50M的空间,而你仅使用了11M,还剩下39M,如果华为告诉你,你的网盘空间剩余
33936KB或0.000037TB,你将很难认知当前你的网盘空间只有39M了。但如果转换到GB,则剩余就应该是0.038G,虽能够较好的感知容量剩余大
小,但此时造成了容量损失为39MB-38.92MB=0.08MB,此种转换不可取,因此显示为39M为最优的容量(既能有效识别容量大小,也能够尽可能 减少容量精度损失)。
因此,需要完成一个容量转换算法:给定一个在KB~EB范围内的任意容量大小,需要将其转换到(1~1024)范围内且合适的容量单位上进行呈现 ,要求:
1) 转换后容量的精度保留3位小数,且精度位需要下取整以保证转换后的容量一定可用;如3.1256,精度位下取整后,数字为3.125。
2) 如果容量转换后输出为0.000,则始终以整数形式输出,结果应为0GB;其余结果都需要保留3位精度。 输入
容量输入格式=容量数字+空格+单位,如2.536 PB;单位有KB、MB、GB、TB、PB、EB
输出
转换后容量输出格式=容量数字+单位,如2.536PB;单位有KB、MB、GB、TB、PB、EB;
样例输入 0.00335 TB 样例输出 3.430GB 提示
1EB=1024PB =1024*1024TB
=1024*1024*1024GB
=1024*1024*1024*1024MB
=1024*1024*1024*1024*1024KB
难度:2级
题目描述
判断给定的数字是否满足给定的条件。 说明:
1、 条件是一个字符串,其格式为由数学上的“开闭区间” ,”&&”和”||”组成。其格式举例:[5,7]&&(6,9]||(10,20),该条件就表示
“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20” 2、 &&优先级高于|| 输入
1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)
2、 数字:判断是否满足条件的数字:9
说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3 输出
如果满足条件,则输出1,否则0
样例输入 [1,2]||(3,4] 3 样例输出 0
难度:3级
#include \#include \void main() { int i,j=0,num; int a[16]={0},b[4]; for(i=0;i<16;i++) scanf(\ for(i=0;i<4;i++) if(a[i]==0xff) { num=i; } for(i=0;i<16;i=i+4) { if(num==0) a[i]=a[1+i]^a[i+2]^a[i+3]; if(num==1) a[i]=a[0+i]^a[i+2]^a[i+3]; if(num==2) a[i]=a[1+i]^a[i+0]^a[i+3]; if(num==3) a[i]=a[1+i]^a[i+2]^a[i+0]; b[j++]=a[i]; } for(i=0;i<4;i++) { printf(\ if(i!=3) printf(\ if(i==3) printf(\ } }
#include \#include \
void main() { double a; char aa,t; int j,bb;
}
char b[6]={'K','M','G','T','P','E'};
scanf(\scanf(\while(1) { t=aa; if((a>1024&&aa=='E')||(a<1&&aa=='K')) break; if(a<1) { a=1024*a; for(j=1;j<6;j++) if(aa==b[j]) { aa=b[j-1]; break; } } if(a>1024) { a=a/1024; for(j=0;j<6;j++) { if(aa==b[j]) { aa=b[j+1]; break; } if(aa=='E') break; } } if((a>=1&&a<=1024)||(a<10e-6&&aa=='k')) break; }
if(a*1000<1) { bb=0; printf(\} else printf(\
共分享92篇相关文档