Fangcheng


私信TA

用户名:uq_16525692591

访问量:261

签 名:

码上 疯癫

等  级
排  名 1427
经  验 2899
参赛次数 0
文章发表 1
年  龄 27
在职情况 学生
学  校 北京大学
专  业 计算机科学与技术

  自我简介:

头发还多

TA的其他文章

qtnu培训练习
浏览:211

解题思路:分析p1、p2、p3代表的意思。利用tolower() 于toupper() 函数

代码中出现了insert() 增加字符 erase() 删除字符,已及sb测试样例1;

p1_other() 代表数字填充

p1_fun1代表填充小写

p1_fun2代表填充大写

p1_fun2代表填充‘*’

p_sum为输出s(目标串)

main为模拟测试样例1(sb)

注意事项: 
if('0' <= s1[0] && s1[0] <= '9'){参考代码)满足条件说明是三个数字,跳到f=1输出正常测试样例。

否则是模拟测试样例1,s2为对应字符串(输人样例)ji为次数变化。s2用来与s1做判断。循环输入与输出。

参考代码:

#include<iostream>
#include<string>
#include<cctype>  //大写转小写tolower()
#include<cstdio>  //小写转大写toupper()
#include<cstring>
using namespace std;
int p1,p2,p3;
string s,s1,s_j;
int sub_s;
bool f=0;
//输出样例次数
int ji=1;
void p1_otther(){
    char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
    int sub4 = sub_s;
    if(p3==1){ //顺序填充
        for(char h=h1;h<=r;h++){
            //填充p2个字符
            s.insert(sub4,p2,h);
            sub4+=p2;
        }
    }
    else if(p3==2){  //逆序填充
        for(char h=r;h>=h1;h--){
            //填充p2个字符
            s.insert(sub4,p2,h);
            sub4+=p2;
        }
    }
    s.erase(sub4,1);
    sub_s=sub4;
}
//p1=1时小写字母
void p1_fun1(){
    //无论什么字符都转成 大写转小写
    char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
    r=tolower(r);         h1=tolower(h1);
    int sub1 = sub_s;
    if(p3==1){       //顺序填充
        for(char h=h1;h<=r;h++){
            //填充p2个元素
            s.insert(sub1,p2,h);
            //向后移动
            sub1+=p2;
        }
    }
    else if(p3==2){  //逆序填充
        for(char h=r;h>=h1;h--){
            //填充p2个元素
            s.insert(sub1,p2,h);
            sub1+=p2;
        }
    }
    //删除多的减号-
    s.erase(sub1,1);
    sub_s=sub1;
}
//p1=2输出大写字母
void p1_fun2(){
    //无论什么字符都 小写转大写
    char r=s[sub_s+1]-1 , h1=s[sub_s-1]+1;
    r = toupper(r);         h1 = toupper(h1);
    int sub2=sub_s;
    if(p3 == 1){ //顺序填充
        for(char h=h1;h<=r;h++){
            //填充p2个字符
            s.insert(sub2,p2,h);
            sub2+=p2;
        }
    }
    else if(p3 == 2){  //逆序填充
        for(char h=r;h>=h1;h--){
            //填充p2个字符
            s.insert(sub2,p2,h);
            sub2+=p2;
        }
    }
    //删除多余减号
    s.erase(sub2,1);
    sub_s=sub2;
}
void p1_fun3(){
    char r = s[sub_s+1]-1 , h1 = s[sub_s-1]+1;
    r = toupper(r);         h1 = toupper(h1);
    //要填充星号
    char ch='*';
    int sub3=sub_s;
    for(int i=h1;i<=r;i++){
        s.insert(sub3,p2,ch);
        sub3+=p2;
    }
    //删除多余减号
    s.erase(sub3,1);
    sub_s=sub3;
}
void p_sum(){
    sub_s = s.find('-');
    while(sub_s != -1){
        //如果前后之间为后继与前驱之间的关系
        if(s[sub_s-1]+1== s[sub_s+1]) s.erase(sub_s,1);
        //右边大于左边
        else if(s[sub_s-1] < s[sub_s+1]){
            //p1不等于3时 填充
            if(p1!=3 && ('0' <= s[sub_s-1] && s[sub_s+1] <= '9') )  p1_otther();
            //p1=1时小写字母
            else if(p1 == 1 && ( ('a'<=s[sub_s-1] && s[sub_s+1]<='z')
                || ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z') ) ){
                p1_fun1();
            }
            //输出大写字母
            else if(p1==2 && ( ('a' <= s[sub_s-1] && s[sub_s+1] <= 'z')
                || ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z') ) ){
                p1_fun2();
            }
            //输出星号 无论是什么字符
            else if(p1 == 3 && ( ('a' <= s[sub_s-1] && s[sub_s+1] <= 'z')
                || ('A' <= s[sub_s-1] && s[sub_s+1] <= 'Z') 
                || ('0' <= s[sub_s-1] && s[sub_s+1] <= '9')
                ) ) {
                p1_fun3();
            }
        }
        sub_s=s.find('-',sub_s+1);
    }
    cout << s;
    //清空元素
    s.clear();
}
int main(){
    char s2[]="输入样例1";
    do{
        getline(cin,s1);
        if('0' <= s1[0] && s1[0] <= '9'){
            int lens1=s1.size();
            for(int i=0;i<lens1;i++)
                 if(s1[i]==' ') s1.erase(i,1);
            p1=(int)(s1[0]-'0'); p2=(int)(s1[1]-'0'); p3=(int)(s1[2]-'0');
            f=1;
            break;
        }
        else if(s1 == s2){
            cin >> p1 >> p2 >> p3
                >> s_j;
            //跑多行
            if(ji!=4){
                cout<<"输出样例"<<ji<<endl;
                s=s_j;
                p_sum(); 
                cout<<endl;
            }
            //清空数组
            memset(s2,0,sizeof(s2));
            ji++;
            sprintf(s2,"输入样例%d",ji);
            
        }
    }while(ji != 4);
    //输入为数字字符
    if(f==1) {
        cin>>s;
        p_sum();
    }
    return 0;
}

 

0.0分

1 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »