<span>程序设计与算法(一)第7周测验(2020春季)</span>
001:统计数字字符个数
- 总时间限制:1000ms
- 内存限制:65536kB
描述
- 输入一行字符,统计出其中数字字符的个数。
输入
- 一行字符串,总长度不超过255。
输出
- 输出为1行,输出字符串里面数字字符的个数。
样例输入
- Peking University is set up at 1898.
样例输出
- 4
AC
#include <iostream>
using namespace std;
char str[300];
int main(){
int n=0;
cin.getline(str,300); //调用函数读入一行字符串
for(int i=0;str[i];i++){
if(str[i]>='0' && str[i]<='9') //是否为数字
n++;
}
printf("%d\n",n);
return 0;
}
002:找第一个只出现一次的字符
- 总时间限制:1000ms
- 内存限制:65536kB
描述
- 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
- 一个字符串,长度小于100000。
输出
- 输出第一个仅出现一次的字符,若没有则输出no。
样例输入
- abcabd
样例输出
- c
AC
#include <iostream>
#include <cstring>
using namespace std;
char str[100010];
int main(){
int n=0,m=0;
gets(str);
n=strlen(str);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(str[i]==str[j] && i!=j)
m=1;
if(m==0){
printf("%c",str[i]);
return 0;
}
m=0;
}
printf("no");
return 0;
}
003:石头剪子布
- 总时间限制:1000ms
- 内存限制:65536kB
描述
- 石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
- 游戏规则:石头打剪刀,布包石头,剪刀剪布。
- 现在,需要你写一个程序来判断石头剪子布游戏的结果。
输入
- 输入包括N+1行:
- 第一行是一个整数N,表示一共进行了N次游戏。1 <= N <= 100。
- 接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):
- S1 S2
- 字符串之间以空格隔开S1,S2只可能取值在{“Rock”, “Scissors”, “Paper”}(大小写敏感)中。
输出
- 输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。
样例输入
3
Rock Scissors
Paper Paper
Rock Paper
样例输出
Player1
Tie
Player2
提示
- Rock是石头,Scissors是剪刀,Paper是布。
思考
- 用列举会超时,首字母判断会使程序简单且用时少,这里使用了二维字符数组。
AC
#include <iostream>
#include <cstring>
using namespace std;
#define p 100
char a[p][p],b[p][p];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
if(a[i][0]=='R'&b[i][0]=='S'||a[i][0]=='S'&&b[i][0]=='P'||a[i][0]=='P'&&b[i][0]=='R')
cout<<"Player1"<<endl;
else if(a[i][0]==b[i][0])
cout<<"Tie"<<endl;
else
cout<<"Player2"<<endl;
}
return 0;
}
004:最长最短单词
- 总时间限制:1000ms
- 内存限制:65536kB
描述
- 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。
- 单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
- 试输出第1个最长的单词和第1个最短单词。
输入
- 一行句子。
输出
- 两行输出:
- 第1行,第一个最长的单词。
- 第2行,第一个最短的单词。
样例输入
- I am studying Programming language C in Peking University
样例输出
- Programming
- I
提示
- 如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
思考
- 第一种方法是思考的,第二种方法是网上的,因为第一个的输出……但是过了!!!
AC1
#include <stdio.h>
#include <string.h>
#define p 200
int main(){
char anum[p],bmax[p],cmin[p];
int maxl=-1,minl=110,count;
while(scanf("%s",a)==1){
count=strlen(anum);
if(count>maxl){ //确定最长的单词
maxl=count;
strcpy(bmax,anum); //将单词从a拷贝到b
}
if(count<minl){ //确定最短的单词
minl=count;
strcpy(cmin,anum);
}
}
printf("%s\n%s",bmax,cmin);
return 0;
}
AC2
#include <iostream>
#include <cstring>
using namespace std;
#define p 20010
int main(){
char anum[p],bmax[p],cmin[p];
int maxl=-1,minl=110,count;
cin.getline(anum,20010);
count=strlen(anum);
int sr=0,sr2=0,sr3=0;
for(int i=0;i<=count;i++){
if(anum[i]!=' ' && anum[i]!=',' && anum[i] !='\0')
sr++;
else if(sr>0){
if(sr>maxl){
maxl=sr;
sr2=i-sr;
}
if(sr<minl){
minl=sr;
sr3=i-sr;
}
sr=0;
}
}
for(int i=sr2;i<=sr2+maxl-1;i++)
cout<<anum[i];
cout<<endl;
for(int i=sr3;i<=sr3+minl-1;i++)
cout<<anum[i];
return 0;
}
005:密码翻译
- 总时间限制:1000ms
- 内存限制:65536kB
描述
- 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。
输入
- 输入一行,包含一个字符串,长度小于80个字符。
输出
- 输出每行字符串的加密字符串。
样例输入
- Hello! How are you!
样例输出
- Ifmmp! Ipx bsf zpv!
思考
- 把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变。
- 注意
其他非字母字符不变,只需把注意变的部分声明即可
。这里字符串时可以直接输出,不用遍历也可以。
AC
#include <iostream>
using namespace std;
char str[100];
int main(){
gets(str);
for(int i=0;str[i];i++){
if((str[i]>='a'&& str[i]<='y')||(str[i]>='A'&& str[i]<='Y'))
str[i]=str[i]+1;
else if(str[i]=='z')
str[i]='a';
else if(str[i]=='Z')
str[i]='A';
}
cout<<str;
return 0;
}
第七周全部题解,🆗。