2008年12月28日星期日

05年第四题 约定的密码

05年第四题 约定的密码

林林和他的几个同学对计算机程序设计都相当有兴趣,假期临近了,他们平时商量研究的一些问题想利用假期进一步完善.因为放假他们无法天天见面,因此他们决定以电子邮件来传送每个人的研究报告,但考虑邮件在传输过程中有可能出现问题,因此商定了一组加密的方式。你作为研究组的成员之一,编程将明码破解出密码。

明码方式一:由四部分组成(此四部分,两两之间用一个空格隔开,以一个$为结束标志),第一部分为数字1用来表示方式1;第二部分为一个键盘符号(不包括空格和$)组成的字符串(长度不超过30个字符);第三部分(m)、第四部分(n) 均为正整数(0<30),表示对于给定的字符串从第m个字符起,截取n个。然后将截得的字符串逆序输出则为密码。

例如:

明码的键盘输入:1 abcdefghlmnopq 3 5$

密码的屏幕输出:gfedc

明码方式二:由三部分组成(此三部分,两两之间用空格隔开,以一个$为结束标志),第一部分为数字2表示方式2;其后为两个不超过五位长的正整数(m,n,2<99999),

求这两个数从m到n之间的所有素数(质数),并将这些素数连结成的没有空格的字符串为密码。

例如:

明码的键盘输入:2 30 80$

密码的屏幕输出:3137414347515357596167717379

分析:
  本题分为两种模式,一种是字符串反向输出,另一种是求某区间内的素数。具体内容是基本算法,本体主要难度在于对输入的处理,应根据空格和$符号对输入进行拆分,在分别根据条件进行处理。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

int main(int argc, char **argv)
{
int len, i, t;
char buffer[60];
char s[4][31], ch;
int last, current;

for (i = 0; i < 4; i++) {
memset(s[i], '\0', sizeof(char) * 31);
}

len = 0;
ch = getchar();
while (ch != 0x0A) {
buffer[len] = ch;
ch = getchar();
len++;
}
buffer[len] = '\0';

t = 0;
last = 0;
current = 0;
for (i = 0; i < len; i++) {
if (buffer[i] == ' ' || buffer[i] == '$') {
current = i;
strncpy(s[t], &buffer[last], current - last);
t++;
last = current;
}
}

if (s[0][0] == '1') {
len = strlen(s[1]);
printf("%d\n", atoi(s[3]));
for (i = atoi(s[2]); i < atoi(s[2]) + atoi(s[3]); i++) {
printf("%c", s[1][len-i]);
}
printf("\n");
} else {
int min, max, j, flg;
min = atoi(s[1]);
max = atoi(s[2]);
for (i = min; i <= max; i++) {
flg = 1;
for (j = 2; j < i; j++) {
if (i % j == 0) {
flg = 0;
break;
}
}
if (flg == 1) {
printf("%d", i);
}
}
printf("\n");
}

return 0;
}

没有评论:

发表评论