福爾摩斯的約會
題目描述:
大偵探福爾摩斯接到一張奇怪的字條:“我們約會吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間“星期四 14:04”,因爲前面兩字符串中第1對相同的大寫英文字母(大小寫有區分)是第4個字母’D’,代表星期四;第2對相同的字符是’E’,那是第5個英文字母,代表一天裏的第14個鐘頭(於是一天的0點到23點由數字0到9、以及大寫字母A到N表示);後面兩字符串第1對相同的英文字母’s’出現在第4個位置(從0開始計數)上,代表第4分鐘。現給定兩對字符串,請幫助福爾摩斯解碼得到約會的時間。
輸入格式:
輸入在4行中分別給出4個非空、不包含空格、且長度不超過60的字符串。
輸出格式:
在一行中輸出約會的時間,格式爲“DAY HH:MM”,其中“DAY”是某星期的3字符縮寫,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期四,FRI表示星期五,SAT表示星期六,SUN表示星期日。題目輸入保證每個測試存在唯一解。
輸入樣例:
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
輸出樣例:
THU 14:04
個人總結:理解題目出錯。題目的意思其實是兩個字符串的上下每一位相對應,判斷相同然後輸出該字符;而我理解成第一行中的某個字母和下一行的任意一個位置的字母相同。當然這樣的想法加大了題目的難度,但最後也還是實現了這樣一種思路。即當比較出來第一對相同大寫字母的同時,記錄c[0]和c[1]查找到的位置(利用全局變量),第二次查找時(即判斷小時),剛好跳過了第一次查找相同的位置。
#include<stdio.h>
int i=0;
char data(char c[][60]);
int data2(char c[][60]);
char data3(char c[][60],int g);
int main(){
int n,date2;
int g=0;
char c[4][60];
for(int m=0;m<4;m++){
gets(c[m]);
}
char date = data(c);
int date1=date-64;
if(date1==1)printf("MON ");
if(date1==2)printf("TUE ");
if(date1==3)printf("WED ");
if(date1==4)printf("THU ");
if(date1==5)printf("FRI ");
if(date1==6)printf("SAT ");
if(date1==7)printf("SUN ");
i++;
for(;c[1][g]!='\0';g++){
if(c[1][g]==date)
break;
}
g++;
char datee = data3(c,g);
if(datee>=48&&datee<=57)
{
date2=datee-48;
}else{
date2=datee-64+9;
}
printf("%d:",date2);
int dateee =data2(c);
if(dateee/10==0){
printf("0");
}
printf("%d",dateee);
return 0;
}
char data(char c[][60]){
for(;;i++){
if(c[0][i]>=65&&c[0][i]<=90){
for(int j=0;c[1][j]!='\0';j++){
if(c[0][i]==c[1][j])
return c[0][i];
}
}
}
return 0;
}
char data3(char c[][60],int g){
for(;;i++){
if(c[0][i]>=48&&c[0][i]<=57){
for(int q=g;c[1][q]!='\0';q++){
if(c[0][i]==c[1][q])
return c[0][i];
}
}
if(c[0][i]>=65&&c[0][i]<=90){
for(int q=g;c[1][q]!='\0';q++){
if(c[0][i]==c[1][q])
return c[0][i];
}
}
}
return 0;
}
int data2(char c[][60]){
for(int k=0;;k++){
if(c[2][k]>=97&&c[2][k]<=122){
for(int f=0;c[3][f]!='\0';f++){
if(c[2][k]==c[3][f]){
return f;
}
}
}
}
return 0;
}
最終正確的代碼如下:
#include <stdio.h>
int is_num_char(char c){
if(c >= '0' && c <= '9')
return c - '0';
if(c >= 'A' && c <= 'N'){
return c - 'A' + 10;
}
return -1;
}
int main(){
char sen[4][61];
for(int i = 0; i < 4; i ++){
scanf("%s",&sen[i][0]);
}
int i = 0;
for(; sen[0][i] != '\0' && sen[1][i] != '\0'; i ++){//前兩個字符的比較
char c = sen[0][i];
if(sen[0][i] == sen[1][i] && (c >= 'A' && c <= 'G')){
switch(c){
case 'A': printf("MON "); break;
case 'B': printf("TUE "); break;
case 'C': printf("WED "); break;
case 'D': printf("THU "); break;
case 'E': printf("FRI "); break;
case 'F': printf("SAT "); break;
case 'G': printf("SUN "); break;
//case 'A': printf("MON "); break;
}
//printf("DAY %c Now i = %d, j = %d\n",sen[0][i], i, j);
break;
}
//printf("DAY %c Now i = %d, j = %d\n",sen[0][i], i, j);
}
i ++;
int y = i;
//printf("Now i = %d, j = %d\n", i, j);
for(; sen[0][y] != '\0' && sen[1][y] != '\0'; y ++){//前兩個字符的比較
if(is_num_char(sen[0][y]) >= 0 && sen[0][y] == sen[1][y]){//A - N 0 - 9
int hour = is_num_char(sen[0][y]);
printf("%d%d:",hour / 10, hour % 10);
//printf("Hour %c %d Now i = %d, y = %d\n",sen[0][i], hour, i, y);
break;
}
}
for(int m = 0; sen[3][m] != '\0' && sen[2][m] != '\0'; m ++){
char c = sen[2][m];
if(sen[2][m] == sen[3][m] && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))){
printf("%d%d",m / 10, m % 10);
break;
}
}
}