三、编程题(4小题共40.0分)程序及结果写入对应文框内
1. 孪生素数查找程序。
所谓孪生素数指的是间隔为2 的相邻素数,就像孪生兄弟。最小的孪生素数是(3, 5),在100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和(71, 73),总计有 8 组。
现给定一个正整数number,要求编程计算出小于等于number的孪生素数的组数,请根据要求,完成getPrimeTwins方法。
方法原型如下:
/**
* 参数:
* number: 查找孪生素数的最大值
* 返回结果:
* 在[0,number]中孪生素数的总组数
**/
int getPrimeTwins(int number){}
我的答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
int
getPrimeTwins( int
number)
{ int
Result = 0;
int
NumMark = 0;
int
i;
for
(i = 3; i <= number; i++)
{
bool
Mark = true ;
int
j;
for
(j = 2; j <= System.Math.Sqrt(i); j++)
{
if
(i % j == 0)
{
Mark = false ;
break ;
}
}
if
(Mark)
{
if
(i - NumMark == 2)
{
Result += 1;
}
NumMark = i;
}
}
return
Result;
} |
2. 文字祖玛游戏
需求如下:
1).程序通过控制台输出一个字符串,由A、B、C、D、E五个字母组成,例如:ACBEEBBAD。
2).用户输入一个字符,只能是A、B、C、D、E其中之一,然后再输入一个要插入的位置。
3).程序会将这个字符插入到字符串的指定位置前(第一个字符位置为0,第二个字符位置为1,依此类推),然后消除连续出现的三个相同的字符,直到没有连续三个相同的字符为止。
例如:
控制台输出:ACBEEBBAD
用户输入:E, 3
控制台输出:ACAD
以上示例表示:在位置3插入E后,结果是:ACBEEEBBAD,消除连续的三个E,结果是:ACBBBAD再次消除连续三个B,结果是:ACAD。
要求如下:
A.为实现此游戏,需要设计一个方法DealString()
/**
* 参数:
* str: 原始字符串
* index: 要插入字符的位置
* letter: 要插入的字符
* 返回结果: 经过处理后的字符串
**/
string DealString(string str,int index,char letter)
{
}
例如:原始字符串是ACBEEBBAD,执行方法DealString(“ACBEEBBAD”,3,’E’)后,会返回ACAD。
B.如果方法输入参数不合理,方法DealString的返回值为null。
我的答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
string
DealString( string
str, int
index, char
letter)
{ if
( string .IsNullOrEmpty(str))
{
return
null ;
}
if
(index < 0 || index > str.Length)
{
return
null ;
}
if
(letter < 65 || letter > 69)
{
return
null ;
}
str = str.Insert(index, letter.ToString()).ToUpper();
char
PChar = ‘\0‘ ;
int
Count = 0;
for
( int
i = 0; i < str.Length; i++)
{
char
Temp = str[i];
if
(PChar == Temp)
{
Count++;
}
else
{
if
(Count >= 3)
{
str = str.Remove(i - Count, Count);
i = 0;
PChar = ‘\0‘ ;
Count = 0;
}
PChar = Temp;
Count = 1;
}
}
return
str;
} |
3. RPG游戏比武算法
在一款RPG游戏中,散落着各式各样的大侠,有上千个之多。他们没有什么固定的事情要做,整天在江湖中走动,碰到和自己不是一派的人,就免不了要比武。但大侠们都很讲义气,绝对不打自己同一派的人。而江湖中存在很多的派别,派别之间的大侠在比武时,辈分越接近掌门人的大侠武功越历害。比如周芷若是峨眉掌门灭绝师太的亲传弟子,而张无忌是明教教主(算是掌门人了),所以周芷若是绝对打不过张无忌的。
假设我们用整数数组来表示一个江湖,数组元素的一个下标表示江湖中的某一位大侠的编号,而数组元素的值保存的则是这位大侠的直接上级(或师父)。请写出一个方法,来判断两位大侠遭遇后是否会比武,如果会,则还要判断谁赢谁输。
数组用例如下:
2 3 5 4 6 7 6 7 8 …
0 1 2 3 4 5 6 7 8 …
如上数组,编号为0的上级是2,2的上级是5,5的上级是7,而7的上级还是7,说明7是掌门人。另外一个掌门人是编号为6的大侠。8是无门无派的大侠,相当于掌门人级别。如果编号为5的大侠和编号为3的大侠比武,肯定是编号为5的赢,因为5是掌门人7的第一代弟子,而3则是掌门人6的第二代弟子。
已有枚举类型如下:
enum FightResult{
WIN, //赢
LOSE, //输
TIE, //打平
ONE_OF_US //自己人
};
定义如下方法:
/**
* 参数:
* heros: 大侠数组,其中保存着所有大侠及其上级
* hero1: 要比武的其中一位大侠的编号
* hero2: 要比武的另外一位大侠的编号
* 返回结果:
* 如果大侠hero1赢,则返回WIN,如果hero2赢,则返回LOSE,
* 如果打平,则返回TIE,如果两位大侠是同一门派,则返回ONE_OF_US;
**/
FightResult Fire(int[] heros, int hero1, int hero2)
{
}
我的答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
FightResult Fire( int [] heros, int
hero1, int
hero2)
{ int
herotemp1 = hero1;
int
level1 = 0;
while
(heros[herotemp1] != herotemp1)
{
level1++;
herotemp1 = heros[herotemp1];
if
(herotemp1 == hero2)
{
return
FightResult.ONE_OF_US;
}
}
int
herotemp2 = hero2;
int
level2 = 0;
while
(heros[herotemp2] != herotemp2)
{
level2++;
herotemp2 = heros[herotemp2];
if
(herotemp2 == hero1)
{
return
FightResult.ONE_OF_US;
}
}
if
(level1 < level2)
{
return
FightResult.WIN;
}
else
if
(level1 > level2)
{
return
FightResult.LOSE;
}
else
{
return
FightResult.TIE;
}
} |
4. Unix登录记录匹配
1).需求描述:
将Unix登录日志文件log.txt中,登录登出记录查找匹配为成对的登录登出日志对,并将成对的日志记录写入文件log-rec.txt中。
2).输入数据描述:
日志文件log.txt中包含用户的登录信息如下:
lidz,441232,7,1382944906,192.168.1.61
baizt,16321,7,1383942096,192.168.1.78
tongxy,15332,7,1384056708,192.168.1.65
moxb,23123,7,1385052008,192.168.1.69
huangr,12348,7,1385148286,192.168.1.38
huangr,12348,8,1385151886,192.168.1.38
luwsh,12356,7,1385255596,192.168.1.45
guojing,12341,7,1385270496,192.168.1.34
luxiucai,21356,7,1385273785,192.168.1.62
guojing,12341,8,1385276564,192.168.1.34
每条登录记录中数据结构是:
登录的OS 账号, 登录的进程 ID,登录状态, 登录/登出的时间, 终端IP
每条登录记录中必须采集如下信息:
3).匹配规则: 具有相同的登录的OS 账号, 登录的进程ID和终端IP 并且登录状态分别是7和8
的登录记录为一对登录数据。
4). 输出文件: 成对的登录记录对文件log-rec.txt,文件内容格式如下:
huangr,12348,7,1385148286,192.168.1.38|huangr,12348,8,1385151886,192.168.1.38
guojing,12341,7,1385270496,192.168.1.34|guojing,12341,8,1385276564,192.168.1.34
5). 要求实现算法:
void matchLog(string logFile, string logRecFile)
该方法,首先读取logFile 文件的内容,然后匹配成登录登出日志对,最后将日志对输出到
logRecFile中。
==
考试期间木有写完~~