C++ 语言篇 字符串及字符数组练习答案

01:统计数字字符个数

#include<bits/stdc++.h>
using namespace std;
char a[300];
int main()
{   gets(a); 
    int k=0,i;
    for(i=0;i<=sizeof(a);i++)
      if (a[i]<='9'&&a[i]>='0' ) k++;
    cout<<k<<endl;
}

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

#include <bits/stdc++.h>
using namespace std;
char a[100000];
int main () {
	cin>>a;
	for(int i=0; i<strlen(a); i++) {
		if(strchr(a,a[i])==strrchr(a,a[i])) {
			cout<<a[i];
			return 0;
		}
	}
	cout<<"no";
}
#include<bits/stdc++.h>
using namespace std;
char a[100001];
int main()
{  int i,j,t=0;
   gets(a);
   for(i=0;i<strlen(a);i++)
   {  t=0;
      for(j=0;j<strlen(a);j++)
      {
		if(a[i]==a[j]) t++;
        //if(t>=2) continue ;
	  }
	  if(t==1) {cout<<a[i]; return 0;}	  
   }
   cout<<"no";      
}

03:基因相关性

#include<bits/stdc++.h>
using namespace std;
char a[500],b[500];
double s,num=0.00;
int sum=0;
int main()
{ cin>>s;
  scanf("%s",a);
  scanf("%s",b);
  sum=strlen(a);
  for(int i=0;i<sum;i++)
    if(a[i]==b[i]) num++;
  if(num/sum>=s) printf("yes");
  else  printf("no");
  return 0;
}

4、石头剪子布

#include<bits/stdc++.h>
using namespace std;
char a[101];
char b[101];
char kongge[3];
int ans[1001];

int main() {
	int n;
	cin>>n;
	for(int i=1; i<=n; i++) {
		scanf("%s",&a);
		scanf("%s",&b);
		if(a[0]=='R'&&b[0]=='R')ans[i]=0;
		if(a[0]=='S'&&b[0]=='S')ans[i]=0;
		if(a[0]=='P'&&b[0]=='P')ans[i]=0;
		if(a[0]=='R'&&b[0]=='S')ans[i]=1;
		if(a[0]=='R'&&b[0]=='P')ans[i]=2;
		if(a[0]=='S'&&b[0]=='R')ans[i]=2;
		if(a[0]=='S'&&b[0]=='P')ans[i]=1;
		if(a[0]=='P'&&b[0]=='S')ans[i]=2;
		if(a[0]=='P'&&b[0]=='R')ans[i]=1;
	}
	for(int i=1; i<=n; i++) {
		if(ans[i]==0) {
			cout<<"Tie"<<endl;
		} else if(ans[i]==1) {
			cout<<"Player1"<<endl;
		} else if(ans[i]==2) {
			cout<<"Player2"<<endl;
		}
	}
	return 0;
}

5、输出亲朋字符串

#include<bits/stdc++.h>
using namespace std;
char s[105],s1[105];
int main()
{
	gets(s);
	for(int i=0;i<strlen(s);i++)
	if(i!=strlen(s)-1)
	s1[i]=s[i]+s[i+1];
	else
	s1[i]=s[i]+s[0];
	puts(s1);
}

6、合法 C 标识符

#include<bits/stdc++.h>
using namespace std;
int main()
{  int i,num;
   char a[21];
   gets(a);
   num=strlen(a);
   if(a[0]>='0'&&a[0]<='9')
   {  cout<<"no";
      return 0;
   }
   for(i=0;i<num;i++)
     if(!(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'||a[i]>='0'&&a[i]<='9'||a[i]=='_'))
     {  cout<<"no";  return 0;} 
   cout<<"yes";
   return 0;
}

7、配对碱基链

#include<bits/stdc++.h>
using namespace std;
int main()
{  char a[256];
   gets(a);
   for(int i=0;i<strlen(a);i++)
   {  if(a[i]=='A') printf("%c",'T');
      if(a[i]=='G') printf("%c",'C');
      if(a[i]=='T') printf("%c",'A');
      if(a[i]=='C') printf("%c",'G');
   }
   return 0;
}

8、字符替换

#include<bits/stdc++.h>
using namespace std;
char a[80],b[80],s,d;
int c;
int main()
{	cin>>a>>s>>d;
    for(int i=0;i<strlen(a);i++)
       if(a[i]==s) a[i]=d;
    cout<<a;
}

9、密码翻译

#include<bits/stdc++.h>
using namespace std;
int main()
{  char a[100];
   cin.getline(a,sizeof(a));
   for (int i=0;i<sizeof(a);i++)
   {  if ((a[i]<'z' && a[i]>='a')||(a[i]<'Z' && a[i]>='A'))a[i]++;
      else if (a[i]=='z')  a[i]='a';
           else if (a[i]=='Z') a[i]='A';
   }
   cout<<a;
   return 0;
}

10、简单密码

#include<bits/stdc++.h>
using namespace std;
int main()
{  char a[202];
   gets(a);
   //cin.getline(a,sizeof(a));
   for (int i=0;i<strlen(a);i++)
   {  if(a[i]>='A'&&a[i]<='Z') 
        if (a[i]<'F') a[i]+=26-5;
        else a[i]-=5 ; 
   }
   cout<<a;
   return 0;
}

11、字符串匹配

12、加密的病历单

13、将字符串中的小写字母转换成大写字母

#include<bits/stdc++.h>
using namespace std;
int main()
{
 char a[101];
 gets(a);
 for(int i=0;i<strlen(a);i++)
 {if(a[i]>='a'&&a[i]<='z')
  a[i]=a[i]-32;
  cout<<a[i];
 }
}

14、大小写字母互换

#include<bits/stdc++.h>
using namespace std;
char a[88];
int main(){
	gets(a);
	for(int i=0;i<=strlen(a);i++){
		if(a[i]>='a'&&a[i]<='z'){a[i]-=32;continue;}
		else if(a[i]>='A'&&a[i]<='Z')a[i]+=32;
	}
	cout<<a;
	return 0;
}

15、整理药名

16、忽略大小写的字符串比较

#include<bits/stdc++.h>
using namespace std;
int main()
{   char a[81],b[81];
    gets(a);
    gets(b);
    if(strcasecmp(a,b)>0) cout<<">";
    if(strcasecmp(a,b)<0) cout<<"<";
    if(strcasecmp(a,b)==0) cout<<"=";    
    return 0;
}

17、字符串判等

#include<bits/stdc++.h>
using namespace std;
string a,b;
int la,lb,i;
int gys(int a,int b)
{   int t;
    while(b!=0)
    { t=a%b;
      a=b;
      b=t;
    }
    return a;
}
int main()
{  while(1)
   { cin>>a;
     if(a=="-1")break;
     cin>>b;
     la=a.size();
     lb=b.size();
     int max=0;
     for(i=0;i<la;i++)
     {  int temp=0;
        for(int j=0,k=i;j<lb&&k<la;j++,k++)
          if(a[k]==b[j]) temp++;
        if  (max<temp) max=temp;  	
     } 
     for(int i=0;i<lb;i++)
     {  int temp=0;
        for(int j=0,k=i;j<la&&k<lb;j++,k++)
           if(a[j]==b[k]) temp++;
        if (max<temp)max=temp;  	
     }     
     max*=2;
     printf("appx(%s,%s)=",a.c_str(),b.c_str());
     if(max==0){printf("0\n"); continue;  }
     if(max==la+lb){printf("1\n"); continue; }
     int temp=gys((lb+la),max);  
      printf("%d/%d\n",max/temp,(lb+la)/temp);	  
   }	
} 

18、验证子串

19、字符串移位包含问题

#include<bits/stdc++.h>
using namespace std;
int main()
{	string a,b;
	cin>>a>>b;
	if(a.size()<b.size()) swap(a,b);
	a=a+a;
	if(a.find(b)!=string::npos)	cout<<"true";
	else cout<<"false";
}

20、删除单词后缀

#include<bits/stdc++.h>
using namespace std;
string a;
int main()
{  getline(cin,a);
   if(a[a.size()-2]=='e'&&a[a.size()-1]=='r') a.erase(a.size()-2,2);
   else if(a[a.size()-2]=='l'&&a[a.size()-1]=='y') a.erase(a.size()-2,2);
   else if(a[a.size()-3]=='i'&&a[a.size()-2]=='n'&&a[a.size()-1]=='g')       
   a.erase(a.size()-3,3);
   cout<<a;
   return 0;
}

21单词替换

22紧急措施

23过滤多余的空格

24单词的长度

#include <bits/stdc++.h>
using namespace std;
int main()
{ char t[20];
  cin>>t;
  cout<<strlen(t);
  while(cin>>t)
  cout<<","<<strlen(t);
}

25最长最短单词

26字符串最大跨距

27单词翻转

28单词倒排

29、字符串乘方

30、字符环

#include<bits/stdc++.h>
using namespace std;
int main()
{  string a,b,s1,s2,k,s3,s4;
   cin>>a>>b;
   s1=a.size()<=b.size()?a:b;
   s2=a.size()>b.size()?a:b;
   s3=s1+s1;
   s4=s2+s2;
   int max=0;
   for(int i=0;i<s1.size();i++)
     for(int j=1;j<=s1.size();j++)
     {  k=s3.substr(i,j);
        if(s4.find(k,0)!=string::npos )
           if(k.size()>max) max=k.size();
     }
     cout<<max;
}

31:字符串p型编码

32:行程长度编码

33:判断字符串是否为回文

34:回文子串

35、数字游戏  NOIP2019复赛 普及组 第一题

#include<iostream>
using namespace std;
int ans=0;//ans计数器
char s[21];//字符串开大一点
int main()
{  cin>>s;
   for(int i=0;i<8;i++)
      if(s[i]=='1') ans++; //判断是否为1,是计数器++ 				
   cout<<ans<<endl;
   return 0;//完美结束
}

 36、标题统计    NOIP2018复赛 普及组 第一题

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	char s[10];
	gets(s);
	int n=strlen(s);
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(s[i]>='A'&&s[i]<='Z')
		ans++;
		if(s[i]>='a'&&s[i]<='z')
		ans++;
		if(s[i]>='0'&&s[i]<='9')
		ans++;
	}
	printf("%d",ans);
	return 0;
}

37、扫雷游戏    NOIP2015复赛 普及组 第一题

#include<bits/stdc++.h>
using namespace std; 
char c[101][101];
int main()
{   int a,b;
    cin>>a>>b;//输入矩阵大小
    for(int i=0;i<a;i++)
        for(int j=0;j<b;j++)       
            cin>>c[i][j];//输入每个位置上的情况       
    for(int i=0;i<a;i++)
    {   for(int j=0;j<b;j++)//循环输出,判断周围是否有雷
        {   int sum=0;
            if(c[i][j]=='*') cout<<'*';//如果该位置有雷,直接输出‘*’
            else         //判断,周围有雷自+1;
            {   if(c[i-1][j+1]=='*') sum++;
                if(c[i][j+1]=='*') sum++;
                if(c[i+1][j+1]=='*') sum++;
                if(c[i-1][j]=='*') sum++;
                if(c[i+1][j]=='*') sum++;
                if(c[i-1][j-1]=='*') sum++;
                if(c[i][j-1]=='*') sum++;
                if(c[i+1][j-1]=='*') sum++;
                cout<<sum;//判断完毕后直接输出sum
            }
        }
        cout<<endl;//换行
    }   
    return 0;     
}

38、计数问题  NOIP2013复赛 普及组 第一题

#include<bits/stdc++.h>
using namespace std; 
int n,x,sum=0;
int main()
{   cin >>n>>x;
    for (int i=1;i<=n;++i) 
	{   if (i>=1000000 && i/1000000==x) sum++;
        if (i>=100000 && i/100000 %10==x) sum++;
        if (i>=10000 && i/10000 %10==x) sum++;
        if (i>=1000 && i/1000 %10==x) sum++;
        if (i>=100 && i/100 %10==x) sum++;
        if (i>=10 && i/10 %10==x) sum++;
        if (i%10==x) sum++; 
    }
    cout<<sum;
    return 0;
}

#include<bits/stdc++.h>
using namespace std; 
int cnt(int n,int x)
{   vector<int> vn;
	while(n!=0)
	{  vn.push_back(n%10);
	   n/=10;
	}
	return count(vn.begin(),vn.end(),x);
}
int main()
{	int a,b,sum=0;
	cin>>a>>b;
	for(int i=1;i<=a;i++) sum+=cnt(i,b);
	cout<<sum<<endl;
}

39、 数字反转   NOIP2011复赛 普及组 第一题

#include<bits/stdc++.h>
using namespace std;
int main()
{  int n,k;
   cin>>n;	
   int sum=0;
   while(n!=0)
   {  int k=n%10;
      sum=sum*10+k;
      n=n/10;
   }
   cout<<sum<<endl;
   return 0; 
}
#include<bits/stdc++.h>//万能头
using namespace std;
stack<char> p;//定义stack
int main()
{  char c;
   while((c=getchar())!='\n')
   {  if(c=='-')printf("-");//判断正负,如果是负就直接输出,不压栈
      else p.push(c);//否则压进栈里
   }
   while(p.top()=='0') p.pop(); //删除前导0	
   while(!p.empty())//最后输出反转数
   {  printf("%c",p.top());
      p.pop();
   }
   return 0;//完美结尾
}

40:ISBN号码   NOIP2008复赛 普及组 第一题

#include<bits/stdc++.h>//万能头
using namespace std;
string s;
int main()
{  cin>>s;//string类型只能够用cin读入
   int tell=s.at(0)-48+(s.at(2)-48)*2+(s.at(3)-48)*3+(s.at(4)-48)*4+(s.at(6)-48)*5
     +(s.at(7)-48)*6+(s.at(8)-48)*7+(s.at(9)-48)*8+(s.at(10)-48)*9;//得到应该得到的值:因为at返回的是一个字符,所以说要减去'0'(48),根据题意,得到这个算式
   char right=tell%11+48;//正确的最后一位的值
   if(right>'9')	right='X';//因为module 11 之后可能会有10,根据题意得到'X'
   if(right==s.at(12))	cout<<"Right";//如果相等,那就是正确的
   else//否则
   { for(int i=0;i<=11;++i)	cout<<s.at(i);//从0~10输出前面的字符
     cout<<right;//然后输出正确的最后一位
   }
	return 0;
}
#include<bits/stdc++.h>//万能头
using namespace std;
int main()
{  char s[14],c;
   cin>>s;
   int h=0,k=0;
   for(int i=0;i<11;i++)
     if(s[i]!='-'){k++; h+=k*(s[i]-'0');}//-0是为了将字符串变成普通数字   
   h%=11;
   if(h==10) c='X';  else c=h+'0';
   if(c==s[12]) cout<<"Right"<<endl;
   else {s[12]=c;cout<<s;}
   return 0;
}

41、统计单词数  NOIP2011复赛 普及组 第二题  

#include <bits/stdc++.h>
using namespace std;
int main()
{  string a;
   string b;
   getline(cin,a);
   getline(cin,b);  
   for (int i=0;i<a.length();++i)  //转换大小写,可以都转换为大写,或者小写
        a[i]=tolower(a[i]);
   for (int i=0;i<b.length();++i)
        b[i]=tolower(b[i]);
   a=' '+a+' ';//因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量
   b=' '+b+' ';
   if (b.find(a)==string::npos)//先看看会不会找不到,用a.find()和string::npos
        cout<<-1<<endl;
   else
   { int alpha=b.find(a); //存取第一个位置
     int beta=b.find(a),s=0;//计数器初始化为0
     while (beta!=string::npos)
     {  ++s;//计数器
        beta=b.find(a,beta+1);
     }
     cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个
   }
}

42、Vigenère 密码   NOIP2012复赛 提高组 第一题

简单来说,就是明文字母=密文字母-密钥字母(当然还要考虑转回来比如a到z)

#include <iostream>
using namespace std;
int main()
{  string k,c;
   cin>>k>>c;
   for (int i=0;i<c.length();i++)
   {  int t=(k[i%k.length()]&31)-1;
      c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
   }
   cout<<c<<endl;
   return 0;
}

43、求先序排列  NOIP2001复赛 普及组 第三题

44、乒乓球    NOIP2003复赛 普及组 第一题

45、FBI树   NOIP2004复赛 普及组 第三题

46、拼数   NOIP1998复赛 提高组 第二题  

47、谁拿了最多奖学金    NOIP2005复赛 提高组 第一题 

48、回文数    NOIP1999复赛 普及组 第二题

49、图书管理员  NOIP2017复赛 普及组 第二题

50、表达式求值    NOIP2013复赛 普及组 第三题

51、多项式输出   NOIP 2009复赛 普及组 第四题

52、 单词接龙     NOIP 2000复赛提高组  第三题      普及组 第四题

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值