NOIP2012 提高组 复赛 day1 vigenere vigenere密码

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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值