标题 | isbn信息学联赛试题 |
范文 | isbn信息学联赛试题 1.ISBN号码 (isbn.pas/c/cpp) 【问题描述】 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在该出版社的编号;最后一位数字为识别码。 识别码的计算方法如下: 首位数字乘以1加上次位数字乘以2以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左到右,分别乘以1,2,,9,再求和,即01+62++29=158,然后取158 mod 11的结果4作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。 【输入】 输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 【输出】 输出文件isbn.in共一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的.格式,输出正确的ISBN号码(包括分隔符-)。 【输入输出样例1】 Isbn.inisbn.out 0-670-82162-4Right 【输入输出样例2】 isbn.inisbn.out 0-670-82162-00-670-82162-4 【试题分析】 首先将ISBN串前9个数字分别转换成整型数并储存在数组里,因为这9个数字从左到右分别乘以1,2,,9的和的最大值小于32767,所以使用整型变量储存。 按试题要求计算识别码,并与ISBN号码中识别码做比较,如果正确,输出Right;如果错误,则输出正确的ISBN号码。 【参考程序】 program isbn; var i,j:integer; s:string; a:array[1..9] of integer; l:char; procedure input;{输入过程} var f:text; begin assign(f,'isbn.in'); reset(f); read(f,s);{将ISBN码读入字符串s中} close(f); end; procedure output;{输出过程} var f:text; begin assign(f,'isbn.out'); rewrite(f); if s[13]=l then write(f,'Right'){如果识别码正确则输出Right} else begin{如果不正确则输出正确的ISBN码} for i:=1 to 12 do write(f,s[i]); write(f,l); end; close(f); end; procedure main;{主过程} begin j:=0; for i:=1 to 11 do{将前九个数转换成整型并存入a数组} if s[i]'-' then begin inc(j); if s[i]='0' then a[j]:=0 else a[j]:= ord(s[i])-48; end; j:=0; for i:=1 to 9 do j:=a[i]*i+j; j:=j mod 11;{计算识别码} if j=10 then l:='X'{处理结果为10} else if j=0 then l:='0' else l:= chr(j+48); end; begin input; main; output; end. 2.排座椅 (seat.pas/c/cpp) 【问题描述】 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,困为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。 请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。 【输入】 输入文件seat.in的第一行,有5个用空格隔开的整数,分别是M,N,K,L,D(2﹤=N,M﹤=1000,0﹤=K﹤M,0﹤=L﹤N,D﹤=2000)。 接下来D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。 输入数据保证最优方案的唯一性。 【输出】 输出文件seat.out共两行。 第一行包含K个整数,a1 a2 ak,表示第a1行和第a1+1行之间、第a2行和a2+1行之间、、第ak行和第ak+1行之间要开展通道,其中ai﹤ ai+1,每两个整数之间用空格隔开(行尾没有空格)。 第二行包含L个整数,b1 b2bl,表示第b1列和b1+1列之间、第b2列和b2+1列之间、、第bl列和第bl +1列之间要开辟通道,其中bi﹤bi+1,每两个整数之间用空格隔开(行尾没有空格)。 【输入输出样例】 seat.inseat.out 4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 42 2 4 【输入输出样例解释】 ┌─┬─╂─┬─╂─┐ 4 │ │* ┃* │ ┃ │ ├─┼─╂─┼─╂─┤ 3 │ │ ┃※│ ┃ │ ━┿━┿━╋━┿━╋━┿ 2 │ │ ┃※│+ ┃+ │ ├─┼─╂─┼─╂─┤ 1 │ │ ┃ │ ┃ │ └─┴─╂─┴─╂─┘ 1 2 ┃3 4 ┃5 【试题分析】 先将每对交头接耳的同学位置(Xi,Yi)与(Pi,Qi)分别读入X、Y、P、Q四个一维数组中,再找出需设通道(隔开交头接耳的学生)的位置,横向通道存入a数组,竖向通道存入b数组,数组的角标表示通道位置,数组内储存能隔开交头接耳学生的对数。 从a、b数组中找出能隔开交头接耳的学生对数最多的通道,分别存入aa、bb数组,排序后输出。 【参考程序】 program seat; type arr=array[1..999] of integer; var m,n,k,l,d,i:integer; x,y,p,q:array[1..2000] of integer; a,b,aa,bb:arr; procedure input; {输入过程} var f:text; begin assign(f,'seat.in'); reset(f); readln(f,m,n,k,l,d); for i:=1 to d do readln(f,x[i],y[i],p[i],q[i]);{读入会交头接耳学生的位置} close(f); end; procedure output;{输出过程} var f:text; begin assign(f,'seat.out'); rewrite(f); for i:=1 to k do begin write(f,aa[i]); if ik then write(f,' ');{防止行尾有空格} end; writeln(f); for i:=1 to l do begin write(f,bb[i]); if il then write(f,' '); end; close(f); end; procedure td(a:arr;k,m:integer;var aa:arr);{ 通道划分过程} var j,u,i,t:integer; begin j:=0; while jk do{找出能隔开交头接耳的学生对数最多的通道} begin u:=-1; for i:=1 to m-1 do if a[i]u then begin u:=a[i]; t:=i; end; a[t]:=-1; inc(j); aa[j]:=t; end; for i:=1 to k-1 do{排序} begin u:=i; for j:=i+1 to k do if aa[j]aa[u] then u:=j; t:=aa[i];aa[i]:=aa[u];aa[u]:=t; end; end; procedure main; {主过程} var u,t,r,o:integer; begin for i:=1 to d do{找出在何处需设通道隔开交头接耳的学生} if y[i]=q[i] then if x[i]p[i] then inc(a[x[i]]) else inc(a[p[i]]) else if y[i]q[i] then inc(b[y[i]]) else inc(b[q[i]]); td(a,k,m,aa); td(b,l,n,bb); end; begin input; main; output; end. |
随便看 |
|
范文网提供海量优质实用美文,包含随笔、日记、古诗文、实用文、总结、计划、祝福语、句子、职场文档等范文,为您写作提供指导和优质素材。