admin 管理员组文章数量: 888297
P1914 小书童 密码(模拟)
这一题我一定得写一篇博客
刚开始我一看是入门难度说这不是随便写么
#include <bits/stdc++.h>
using namespace std;
int main(){int n;string s;cin>>n>>s;for(int i=0;i<s.size();i++){s[i]+=n;while(s[i]>='z') s[i]-=26;cout<<s[i];}return 0;
}
结果:
总结踩的坑点:
1.我的循环条件会导致‘z’变成’a’,但事实上应该是’z’+1变成’a’
2.char类型的整数值默认是-128~+127,如果是’z’+26直接溢出变为负值了,会输出一堆中文。
虽然在我改用unsigned char(0~255)后全部ac了,但还是提倡这种写法:s[i]=(s[i]-‘a’+n)%26+‘a’,
既然要不停地减26,那么直接取模不就好了么,所以化while循环为一个对26的取模操作。
而且这种写法直接先计算好了一个‘a’到’z’的值,char和string都可以用,是绝对不会溢出的!
AC代码:
#include <cstdio>
int main(){int n;unsigned char s[100]={0};scanf("%d%s",&n,&s);for(int i=0;s[i]!='\0';i++){s[i]+=n;while(s[i]>'z') s[i]-=26;printf("%c",s[i]);}return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main(){int n;string s;cin>>n>>s;for(int i=0;i<s.size();i++){s[i]=(s[i]+n-'a')%26+'a';cout<<s[i];}return 0;
}
本文标签: P1914 小书童 密码(模拟)
版权声明:本文标题:P1914 小书童 密码(模拟) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1693584423h230675.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论