您的位置:首页 > 其它

NOIP2012 提高组 复赛 day1 vigenere vigenere密码

2016-08-24 20:24 519 查看
NOIP2012 提高组 复赛 day1 vigenere vigenere密码

1、经过《算法竞赛入门经典(第2版)》第三章 数组和字符串 的训练,此题几乎没费什么力,代码就写出了。

2、写代码过程中的一个失误是将输入读成密码,明文,输出为密文,改起来没费什么周折,只是将+改成-。

3、编译后,输出与预想的不一样,跟踪调试上花了点时间,很快就改好了。

4、输出结束后要不要回撤换行,斗争了小一会,最后决定加上,不然怎么判断是完整的一行呢。

5、经对拍对比,此题10个输入输出完全正确,100分。

 

编译环境Dev-C++4.9.9.2

附上代码:

 

#include <stdio.h>

#include <string.h>

char k[100+10],m[1000+10];

int main(){

    int klen,mlen;

    int i,j;

    int pos;

    char c;

    FILE *fin,*fout;

    fin=fopen("vigenere.in","rb");//文件打开

    fout=fopen("vigenere.out","wb");

    fscanf(fin,"%s%s",k,m);

    klen=strlen(k);

    mlen=strlen(m);

    for(i=0;i<mlen;i++){

        j=i%klen;

        if(k[j]>='A'&&k[j]<='Z'){//大写字母

            pos=k[j]-'A';//确定偏移位置

        }else{//小写字母

            pos=k[j]-'a';

        }

        if(m[i]>='A'&&m[i]<='Z'){//大写字母

            c='A'+(m[i]-'A'-pos+26)%26;

            fprintf(fout,"%c",c);

        }else{//小写字母

            c='a'+(m[i]-'a'-pos+26)%26;

            fprintf(fout,"%c",c);

        }

       

    }

    putchar('\n');//换行

    fclose(fin);

    fclose(fout);//文件关闭

    return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: