NOI 1.7编程基础之字符串(35题)

本文聚焦于NOI编程竞赛中C/C++的基础知识,特别是字符串处理。通过一道统计数字字符个数的题目,引导读者理解并实践字符串操作。提供查看、提交、统计和提问的功能,帮助学习者深入掌握相关技能。
摘要由CSDN通过智能技术生成

01:统计数字字符个数

总时间限制: 
1000ms
内存限制: 
65536kB
描述

输入一行字符,统计出其中数字字符的个数。

输入
一行字符串,总长度不超过255。
输出
输出为1行,输出字符串里面数字字符的个数。
样例输入
Peking University is set up at 1898.
样例输出
4
来源
习题(7-1) 医学部 2010 期末试题 樊波
 1 #include<cstdio>
 2 #include<cstring>
 3 char a[1000];
 4 int main()
 5 {
 6    
 7   unsigned int i,count=0;
 8   gets(a); 
 9   for(i=0;i<=strlen(a)-1;i++) 
10   if(a[i]>='0'&&a[i]<='9') 
11   count++; 
12   printf("%d",count);
13   return 0;
14 }

02:找第一个只出现一次的字符

总时间限制: 
1000ms
内存限制: 
65536kB
描述

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。

输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
样例输入
abcabd
样例输出
c
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 char s[103000];
 7 int zj=0,flag=0,t;
 8 struct node
 9 {
10     int x;//字符出现次数 
11     int y;//标号 
12     int c;//字符码 
13 };node a[101],f[101];
14 int cmp(const node &p,const node &q)
15 {
16     return p.y<q.y;
17 }
18 int main()
19 {
20     scanf("%s",s+1);
21     int len=strlen(s+1);
22     for(int i=1;i<=30;i++)
23       a[t].x=0,a[t].y=99;
24     for(int i=1;i<=len;i++)
25       {
26           t=s[i]-96;a[t].x++;
27         if(a[t].x==1) a[t].y=i;
28       }
29     for(int i=1;i<=30;i++)
30       if(a[i].x==1) f[++zj].x=a[i].x,f[zj].y=a[i].y,f[zj].c=i,flag=1;
31     if(flag==1)
32     {
33       sort(f+1,f+zj+1,cmp);
34       putchar(f[1].c+96);
35     }
36     else printf("no");
37     return 0;
38 }

03:基因相关性

总时间限制: 
1000ms
内存限制: 
65536kB
描述

为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。

现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。

输入
有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。
输出
若两条DNA序列相关,则输出“yes”,否则输出“no”。
样例输入
0.85
ATCGCCGTAAGTAACGGTTTTAAATAGGCC
ATCGCCGGAAGTAACGGTCTTAAATAGGCC
样例输出
yes
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 char a[501],b[501];
 6 double p,ans=0;
 7 int main(){
 8     cin>>p;
 9     scanf("%s%s",a,b);
10     int len=strlen(a),i=0;
11     while(i<len){
12         if(a[i]==b[i]) ans++;
13         i++;    
14     }
15     double l=len;
16     printf("%s\n",ans/l>p?"yes":"no");
17     return 0;
18 }

04:石头剪子布

总时间限制: 
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是布。
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int a[10];
 5 char s1[100],s2[100];
 6 int main()
 7 {
 8     int n,i;
 9     scanf("%d",&n);
10     for(i=1;i<=n;++i)
11     {
12         scanf("%s",s1);
13         scanf("%s",s2);
14         if (s1[0]=='R') 
15           {
16               if(s2[0]=='R') a[i]=0;
17               if(s2[0]=='S') a[i]=1;
18               if(s2[0]=='P') a[i]=2;
19           }
20           if (s1[0]=='P') 
21           {
22               if(s2[0]=='R') a[i]=1;
23               if(s2[0]=='S') a[i]=2;
24               if(s2[0]=='P') a[i]=0;
25           }
26           if (s1[0]=='S') 
27           {
28               if(s2[0]=='R') a[i]=2;
29               if(s2[0]=='S') a[i]=0;
30               if(s2[0]=='P') a[i]=1;
31           }
32           if(a[i]==1) printf("Player1\n");
33           if(a[i]==2) printf("Player2\n");
34           if(a[i]==0) printf("Tie\n");
35     }
36     
37     return 0;
38 }

05:输出亲朋字符串

总时间限制: 
1000ms
内存限制: 
65536kB
描述

编写程序,求给定字符串s的亲朋字符串s1。 

亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符; 给定字符串s的第二个字符的ASCII值加第三个字符的ASCII值,得到第二个亲朋字符;依此类推,直到给定字符串s的倒数第二个字符。亲朋字符串的最 后一个字符由给定字符串s的最后一个字符ASCII值加s的第一个字符的ASCII值。

输入
输入一行,一个长度大于等于2,小于等于100的字符串。字符串中每个字符的ASCII值不大于63。
输出
输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。
样例输入
1234
样例输出
cege
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 521
 7 char a[N],c[N];
 8 int main(){
 9     //freopen("sh.txt","r",stdin);
10     gets(a);
11     int len=strlen(a);
12     for(int i=0;i<len-1;i++)
13       c[i]=a[i]+a[i+1];
14     c[len-1]=a[0]+a[len-1];      
15     puts(c);
16     return 0;
17 }

06:合法 C 标识符

总时间限制: 
1000ms
内存限制: 
65536kB
描述

给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)。

C语言标识符要求:

1. 非保留字;

2. 只包含字母、数字及下划线(“_”)。

3. 不以数字开头。

输入
一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20。
输出
一行,如果它是C语言的合法标识符,则输出yes,否则输出no。
样例输入
RKPEGX9R;TWyYcp
样例输出
no
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 char s[501];
 6 double p,ans=0;
 7 int main(){
 8     scanf("%s",s);
 9     int len=strlen(s);
10     if(s[0]>='0'&&s[0]<='9') {printf("%s\n","no");return 0;}
11     for(int i=0;i<len;i++)
12         if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')||s[i]=='_');
13         else {printf("%s\n","no");return 0;}
14     printf("%s\n","yes");
15     return 0;
16 }

07:配对碱基链

总时间限制: 
1000ms
内存限制: 
65536kB
描述

脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

输入
一个字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C,分别表示腺瞟呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。字符串长度不超过255。
输出
一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。
样例输入
ATATGGATGGTGTTTGGCTCTG
样例输出
TATACCTACCACAAACCGAGAC
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 char s[501],c[501];
 6 int main(){
 7     scanf("%s",s);
 8     int len=strlen(s);
 9     for(int i=0;i<len;i++)
10         switch(s[i]){
11                case 'T':c[i]='A';break;
12                case 'A':c[i]='T';break;
13              case 'G':c[i]='C';break;
14                case 'C':c[i]='G';break;    
15         }
16     puts(c);
17     return 0;
18 }

08:字符替换

总时间限制: 
1000ms
内存限制: 
65536kB
描述

把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。

输入
只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。字符串是待替换的字符串,字符串长度 小于等于30个字符,且不含空格等空白符;
接下来一个字符为需要被替换的特定字符;
接下来一个字符为用于替换的给定字符。
输出
一行,即替换后的字符串。
样例输入
hello-how-are-you o O
样例输出
hellO-hOw-are-yOu
 1 #include<cstring>
 2 #include<iostream>
 3 using namespace std;
 4 char c[30],a,b;
 5 int main(){
 6      cin>>c>>a>>b;
 7      int i;
 8      for(i=0;i<strlen(c);i++){
 9          if(c[i]==a)c[i]=b;
10     }
11      for(i=0;i<strlen(c);i++)cout<<c[i];
12      return 0;
13 }

09:密码翻译

总时间限制: 
1000ms
内存限制: 
65536kB
描述

在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。

输入
输入一行,包含一个字符串,长度小于80个字符。
输出
输出每行字符串的加密字符串。
样例输入
Hello! How are you!
样例输出
Ifmmp! Ipx bsf zpv!
来源
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 char s[501];
 6 int main(){
 7     gets(s);
 8     int len=strlen(s);
 9     for(int i=0;i<len;i++){
10         if((s[i]>='a'&&s[i]<='y')||(s[i]>='A'&&s[i]<='Y')) {s[i]++;continue;}
11         if(s[i]=='z') {s[i]='a';continue;}
12         if(s[i]=='Z') {s[i]='A';continue;}
13     }    
14     puts(s);
15     return 0;
16 }

10:简单密码

总时间限制: 
1000ms
内存限制: 
65536kB
描述

Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。

密文
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

明文
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 

你的任务是对给定的密文进行解密得到明文。

你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入
一行,给出密文,密文不为空,而且其中的字符数不超过200。
输出
输出一行,即密文对应的明文。
样例输入
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
样例输出
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值