规则有点多吧;
isdigit(char) 表示如果字符是数字返回一,否则返回0;
倒序做一个下标就行了;
巧用三目运算符避开分类讨论,避开开头和结尾,根据条件层层逼近;
#include<cstring> #include<cstdio> #include<iostream> #include<algorithm> #include<string> using namespace std; const int maxn=9102; char s[maxn],ans[maxn]; int pos; int p1,p2,p3; int main() { scanf("%d%d%d",&p1,&p2,&p3); scanf("%s",s); int len=strlen(s); ans[pos++]=s[0]; for(int i=1;i<len-1;i++) { if(s[i]=='-'&&s[i-1]!='-') { if((isdigit(s[i-1])!=isdigit(s[i+1]))||s[i-1]>=s[i+1]) {ans[pos++]=s[i];continue;} int qw=s[i+1]-s[i-1]-1; for(int j=1;j<=qw;j++) { int now=(p3==1?j:qw-j+1); for(int k=1;k<=p2;k++) { if(p1==3) ans[pos++]='*'; else ans[pos++]=s[i-1]+now-(!isdigit(s[i-1])&&p1==2?32:0); } } } else ans[pos++]=s[i]; } ans[pos]=s[len-1]; cout<<ans; return 0; }