这个实在是怨念深重的一个问题,没想到用它来开篇了,加密解密的,凯撒密码的变种,字符串模拟中最简单最简单的一类,但是让输入输出给搞死了,暑假搞死,现在依然被搞了30MIN,真是弱爆了。
这个题INPUT SAMPLE:
START
NS BFW ……一堆……
END
START
……一堆……
END
……
ENDOFINPUT
OUTPUT:
IN WAR……解密之后的,连规则都告诉你了。
起初写了一个“无懈可击”的,OF COURSE,至少从肉眼上看上去是……
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
string encoding="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string decoding="VWXYZABCDEFGHIJKLMNOPQRSTU";
int main()
{
string shuru;
while(cin>>shuru && shuru!="ENDOFINPUT")
{
if(shuru=="START")
{
char needtodec[100];
string ctrl;
cin.getline(needtodec,100);
cin>>ctrl;
int i,j;
for(i=0;i<=strlen(needtodec);i++)
{
for(j=0;j<26;j++)
{
if(needtodec[i]==encoding[j])
{
needtodec[i]=decoding[j];
}
}
}
if(ctrl=="ENDOFINPUT")
{
return 0;
}
}
}
return 0;
}
(第1个TRAP)自己运行改程序,毫无结果。
后来查阅该问题,发现cin之后,空格还存在缓冲区里呢……
于是添加fflush(stdin),无效……
再查阅,改为cin.sync(),无效……
Cin.clear(),无效……
传说fgets()忽略之前缓冲区,结果还是无效……
顿时头大了。
看题解,发现只有gets()可以用用,自己探索,getchar()也可以忽略空格。
(第二个TRAP)
好吧,使用了getchar(),能输出了,输出看一下……
不对?!怎么NS BFW翻译出来的是IN RAR?不是WAR吗?
于是开始怀疑自己小学时没好好学英语,英语顺序背错了,重打一遍,结果还是RAR,所有B对应的都是R不是W。
仔细一看,R对着W,B对着W,B->R->W,坑啊。
加上break;后,问题解决。
一道做过的老题,时隔数月掉沟里,真不容易。
顿时感觉自己真的真的只能做做A+B了,不对,连A+B都错……不信看看“一寸山河一寸血”的A+B PRETICE VII……
还是从头再来吧,附正确且麻烦的版本一个。
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
char encoding[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char decoding[]="VWXYZABCDEFGHIJKLMNOPQRSTU";
int main()
{
char shuru[1050];
while(gets(shuru) && strcmp(shuru,"ENDOFINPUT"))
{
if(! strcmp(shuru, "START") || ! strcmp(shuru, "END"))
continue;
int i,j;
for(i=0;i<=strlen(shuru);i++)
{
for(j=0;j<26;j++)
{
if(shuru[i]==encoding[j])
{
shuru[i]=decoding[j];
break;//holy shit!!
}
}
}
printf("%s\n",shuru);
}
return 0;
}
第一次三天解禁用CSDN,略兴奋,写的挺长的……