这个题目的题型叫模拟,就是按照约定执行相应的程序得到结果。
p1,为1时填充小写字母,为2时填写大写字母(数字不用变),为3时用号填充
p2,为k时,填充k个
p3,为1时,正常填充,为2时逆序填充
特殊情况 b-a,b-b 减号左边大于等于右边要直接输出;减号填充时左右俩边要相同属性(字母或数字)才能填充;a-b,或1-2直接输出ab,12;
做这种题目要一步一步解决,首先我们可以写一个判断程序来解决(减号填充时左右俩边要相同属性(字母或数字)才能填充和b-a,b-b 减号左边大于等于右边要直接输出),
再写个填充程序来将a-c直接的展开,这个我们需要将原数组进行变动,所以可以增加另一个数组来存-(减号)后面的数据,**等解决*减号展开的问题后再把原来的数据(另一个数字)复制都后面;这样可以快一点;
#include<stdio.h>
#include<string.h>
int isfun(char z1,char z2)//判断是否可以填充
{
if(!((z1>='0'&&z1<='9'&&z2>='0'&&z2<='9')||(z1>='a'&&z1<='z'&&z2>='a'&&z2<='z')))return 0;
if(z1>=z2)return 0;//判断这种情况c-a或a-a,1-1,4-1
else return 1;
}
char *tianfun(char *a,char z1,char z2,int p1,int p2,int p3)//填充里面的东西
{
if(z2==z1+1)return a;//对这种情况的解决a-b
int i;
char *s=a,*j,*k;
while(z1<z2-1)//a-d之间的填充
{
if(p1==1)
for(i=0;i<p2;i++)*a=z1+1,a++;
else if(p1==2){if((z1>='a'&&z1<='z'))for(i=0;i<p2;i++)*a=z1+1-32,a++;
else for(i=0;i<p2;i++)*a=z1+1,a++;}
else {for(i=0;i<p2;i++)*a='*',a++;}
z1=z1+1;
}
if(p3==2)//是否逆序
{
j=s,k=a-1;
char t;
while(j<k)
{
t=*j;
*j=*k;
*k=t;
j++;
k--;
}
}
return a;
}
int main()
{
int p1, p2 , p3;
scanf("%d%d%d",&p1,&p2,&p3);
char a[10000],b[100000];
scanf("%s",&a);
char *s=a,z1,z2;
while(*s)
{
if(*s!='-')s++; //判断-
if(*s!=0){z1=*(s-1),z2=*(s+1);}//取-前后的字母
if(*s=='-'&&isfun(z1,z2))//判断是否要填充
{
strcpy(b,s+1);//向把-后面的先保存在另一数组
s=tianfun(s,z1,z2,p1,p2,p3); //填充
strcpy(s,b);//填充完后还回来
}
s++;
}
printf("%s",a);
}