P5015 标题统计
这道题提交时95分,刚开始一直没想出来错在哪里,看了题解才知道需要重新设一个初始值为0的变量,如果符合条件,就让变量加一。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
int m=0;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]!=' '&&s[i]!='\n'){
m++;
}
}
printf("%d",m);
return 0;
}
这道题要注意判断在字母移动之后会不会大于Z!
定义一个变量,让这个变量等于n模26,然后判断ch[i]与‘z’的大小关系。
判断代码如下:
for(int i=0;i<len;i++){
if(ch[i]+m>'z'){
ch[i]=ch[i]-26+m;
}
else{
ch[i]+=m;
}
}
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
char ch[55];
int main(){
int n;
cin>>n;
cin>>ch;
int len=strlen(ch);
int m=n%26;
for(int i=0;i<len;i++){
if(ch[i]+m>'z'){
ch[i]=ch[i]-26+m;
}
else{
ch[i]+=m;
}
}
cout<<ch<<endl;
return 0;
}
P3741 honoka的键盘
首先分析这道题只有四种排列情况:KK,VV,VK,KV。
VK是符合条件的,如果出现KK或VV时,改动一次就可以得到一个VK,设一个for循环,此时,跳出循环,KV不能改。
for循环如下:
for(int i=0;i<n;i++){
if((ch[i]=='V')&&(ch[i+1]=='K')){
ans++;
ch[i]='A';
ch[i+1]='A';
}
}
for(int i=0;i<n;i++){
if((ch[i]!='A')&&(ch[i]==ch[i+1])){
ans++;
break;
}
}
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
char ch[105];
int main(){
int n=strlen(ch);
cin>>n;
cin>>ch;
int ans=0;
for(int i=0;i<n;i++){
if((ch[i]=='V')&&(ch[i+1]=='K')){
ans++;
ch[i]='A';
ch[i+1]='A';
}
}
for(int i=0;i<n;i++){
if((ch[i]!='A')&&(ch[i]==ch[i+1])){
ans++;
break;
}
}
printf("%d",ans);
return 0;
}
P1321 单词覆盖还原
这道题就是找出在所给的字符串中连着的b,o,y或是g,i,r,l的部分,用循环逐个找出所有情况。设置两个计数器:boy=0;girl=0;如果符合条件,对应的值加一。
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int boy=0,girl=0;
string st;
cin>>st;
int len=st.length();
for(int i=0;i<=len;i++){
if (st[i]=='b'||st[i+1]=='o'||st[i+2]=='y')
boy++;
if (st[i]=='g'||st[i+1]=='i'||st[i+2]=='r'||st[i+3]=='l')
girl++;
}
cout<<boy<<endl;
cout<<girl<<endl;
return 0;
}
P1125 笨小猴
这道题需要记录每一个字母出现的个数,定义计数数组表示字母出现个数。这就用到A册书P260应用技巧二:字符数组元素作为下标实现数组元素的计数。使用打擂台的方式选出最大值与最小值。
代码如下:
#include<bits/stdc++.h>
using namespace std;
char ch[105];
int cnt[27];
int main(){
int mx=0,mn=1000;
scanf("%s",ch);
int len=strlen(ch);
for(int i=0;i<len;i++) cnt[ch[i]-96]++;
for(int i=1;i<=26;i++){
mx=max(mx,cnt[i]);
if(cnt[i]) mn=min(mn,cnt[i]);
}
int s=mx-mn;
bool flag=true;
if(s==1||s==0) flag=false;
else{
for(int i=2;i<=sqrt(s);i++){
if(s%i==0){
flag=false;
break;
}
}
}
if(flag==true){
printf("Lucky Word\n%d",s);
}
else{
printf("No Answer\n0");
}
return 0;
}
P1603 斯诺登的密码
整个题的过程:
1.依次读入6个字符串。
2.判断读入的字符串是否为数字,如果是的话,则计算x的平方%100的值,并将计算结果存入到num数组中。
3.将数组中的数字按照从小到大进行排序,并依次输出数组中的元素。
注意:在输出结果的时候,需要判断每个数字是否为2位,如果不是二位的话,前边需要补0。
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int num[8];
bool flag=false;
int cnt=0;
int index1=1;
int cal(string s){
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]+=32;
}
}
if(s=="zero") return 0;
if(s=="one"||s=="a"||s=="another"||s=="first") return 1;
if(s=="two"||s=="both"||s=="second") return 4;
if(s=="three"||s=="third") return 9;
if(s=="four") return 16;
if(s=="five") return 25;
if(s=="six") return 36;
if(s=="seven") return 49;
if(s=="eight") return 64;
if(s=="nine") return 81;
if(s=="ten") return 0;
if(s=="eleven") return (11*11%100);
if(s=="twelve") return (12*12%100);
if(s=="thirteen") return (13*13%100);
if(s=="fourteen") return (14*14%100);
if(s=="fifteen") return (15*15%100);
if(s=="sixteen") return (16*16%100);
if(s=="seventeen") return (17*17%100);
if(s=="eighteen") return (18*18%100);
if(s=="nineteen") return (19*19%100);
if(s=="twenty") return (20*20%100);
return -1;
}
void save(int x){
if(x!=-1){
flag=true;
if(x!=0){
num[index1++]=x;
cnt++;
}
}
}
void bubble(int a[],int n){
for(int i=1;i<n;i++){
for(int j=1;j<=n-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
}
}
int main(){
string s;
int x;
for(int i=1;i<=6;i++){
cin>>s;
x=cal(s);
save(x);
}
bubble(num,cnt);
if(!flag){
printf("0\n");
}
else{
printf("%d",num[1]);
for(int i=2;i<=cnt;i++){
printf("%02d",num[i]);
}
}
return 0;
}
文章介绍了几个编程题目,涉及字符操作、字符串处理、计数、排序算法等,如字符移动后的判断、键盘排列变换、单词覆盖计数、数字字符串解析等技术点。
3206

被折叠的 条评论
为什么被折叠?



