首先,我想申明的是,这里的ACM竞赛是我们学院自己组织的,题目不是很难,不过只有几题,现在把另外两题补上!此外,我还附上了自己写的答案。有兴趣的朋友不妨也写下,或者帮我更正一下!题目见下:
Problem B Casesar 密码
(Time Limit :1 Seconds ,Memory limit :32768K ,input file:casesar.in)
Julius Casesar生活在战争年代,为了生存,他发明了Casesar密码。用于军队消息传送,作为Casesar军团的一名军官,你需要将Casesar密码破译出来给你的Boss,消息的加密方式是:对于消息原文中的每个字母,分别用该字母之后的第5个字母替换,
密码字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ
原文字母:VMXYZABCDEFGHIJKLMNOPQRSTU
现在有不超过100个的数据集,每个数据集不超过200个字符,将其转换为原文。
Input:不超过100个字符的数据集
Output:每个数据对应一行,输出为Casesar的原始消息
例子:
Sample Iutput:
MR AEV,IZIRXW SJ MQTSVXERXGI EVI XLII VIWYPX SJ XVMZMEP GEYWIW
M ASYPH VEXLIV FI JMVWX MR E PMXXPII MRIVMER ZMPPEKI XLER WIGSRH MR VSQI
Sample Output:
IN WAR,EVENTS OF IMPORTANTCE ARE THEE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLEE INERIAN VILLAGE THAN SECOND IN ROME
源程序如下:
import java.io.*;
import java.util.Arrays;
public class Casesar {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("casesar.in");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
Decode myDecode = new Decode(br);
myDecode.getCasesar();
}
}
class Decode {
BufferedReader br;
Decode(BufferedReader br) {
this.br = br;
}
public void getCasesar() throws IOException {
String str = null;
char[] CharArray;
str = br.readLine();
while (str != null) {
CharArray = str.toCharArray();
decodeMethod(CharArray);
str = br.readLine();
}
}
public void decodeMethod(char[] CharArray) {
for (int i = 0; i < CharArray.length; i++) {
if ('A' <= CharArray[i] && CharArray[i] <= 'D')
CharArray[i] = (char) (CharArray[i] + 22);
else if ('E' <= CharArray[i] && CharArray[i] <= 'Z')
CharArray[i] = (char) (CharArray[i] - 4);
}
for (int i = 0; i < CharArray.length; i++)
System.out.print(CharArray[i]);
System.out.println();
}
}
说明:在指定目录下建立一个casesar.in文件,以记事本方式打开,输入两行文本,如下所示:
MR AEV,IZIRXW SJ MQTSVXERXGI EVI XLII VIWYPX SJ XVMZMEP GEYWIW
M ASYPH VEXLIV FI JMVWX MR E PMXXPII MRIVMER ZMPPEKI XLER WIGSRH MR VSQI
Problem E 二倍数 (Doubles)
ZJU 1760 Doubles
(Time Limit :1 Seconds ,Memory limit :32768K ,input file : double.in)
请你写出一个算术程序,将随机地给出一列包含2到15个正整数的数列,程序判定有多少对数,其中一个数是另一个数的2倍(Double)。你的程序将能够读取一个数列,计算出每个数列的正确结果。例如,将给出下面的数列
1 4 3 2 9 7 18 22
你的结果应该是3(2是1的两倍,4是2的两倍,18是9的两倍)。
Input:输入将是一列或多列数列,每列包含2到15个正整数(大于0而小于39),每列以0为标记结束,但0不在数列内。输入-1代表程序停止。
Output:每个输出只有一行输出结果。
例子:
Sample Input:
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
Output:
3
2
0
源程序:
import java.io.*;
public class Doubles {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("double.in");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
CalculateDoubles myCalculateDoubles = new CalculateDoubles(br);
myCalculateDoubles.getDoubles();
}
}
class CalculateDoubles {
public final static int COUNT = 15;
BufferedReader br;
CalculateDoubles(BufferedReader br) {
this.br = br;
}
public void getDoubles() throws IOException {
String str = null;
String[] StringArray = new String[COUNT];
Integer[] IntegerArray = new Integer[COUNT];
str = br.readLine();
while (str != null) {
StringArray = str.split(" ");
for (int i = 0; i < StringArray.length; i++) {
IntegerArray[i] = Integer.parseInt(StringArray[i]);
}
calculateMethod(IntegerArray);
str = br.readLine();
}
}
public void calculateMethod(Integer[] IntegerArray) {
int c = 0;
int count = 0;
if(IntegerArray[c]==-1)
return;
while (IntegerArray[c] != 0) {
c++;
}
for (int i = 0; i < c; i++) {
for (int j = 0; j < c; j++) {
if (IntegerArray[i] * 1.0 / IntegerArray[j] == 2)
++count;
}
}
System.out.println(count);
}
}
说明:
1. 在指定目录下建立double.in文件,并以记事本程序打开,在该文件中的输入如下:
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1