P5015 标题统计 P1914 小书童-凯撒密码 P3741 honoka的键盘 P1321 单词覆盖还原 P1125 笨小猴 P1603 斯诺登的密码

文章介绍了几个编程题目,涉及字符操作、字符串处理、计数、排序算法等,如字符移动后的判断、键盘排列变换、单词覆盖计数、数字字符串解析等技术点。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值