Description
X国发明一种新的加密方法,通过用机器扫描一串大小写字母和数字组成的密文可以产生对应的原文。机器从左到右扫描所有的字符。每碰上一个数字,就会将数字的值作为翻转字符串的开头位置,当前数字的位置作为翻转字符串的末尾执行字符串翻转操作。字符串的位置从0开始计算。
比如说,对于序列aabb1lsi5
,机器在扫描到第一个数字1的时候,会对之前的字符串aabb
从位置1到最后一个位置进行翻转,得到新字符串abba
;在扫描到第二个数字5的时候,会对之前得到的字符串abbalsi
从位置5到最后一个位置进行翻转,得到新字符串abbalis
。最后得到的新字符串即为原来密文字符串所对应的原文。
因为机器的识别原理比较简单,需要严格保密,所以X国委托你来给他们制造这台机器。过来交接的技术人员向你保证,所有机器识别到的数字一定比当前的位置要小,且最终生成的原文不会超过100个字符。
Input
输入一个字符串,表示输入的密文字符串,字符串中仅包含大小写字母和数字,长度不超过100。
Outupt
输出一个字符串,表示机器得到的原文字符串
Sample Input
Hel,ol3!dlrow6
Sample Output
Hello,world!
先明确任务:
1.定义新的字符串 b 装输出装处理原字符串 a 后的字符串
2.找到字符串中的数
3.将 b 以读取到的的数 p 为位置翻转
4.找到数 p 的位数 x ,i+=x
以下为实现代码:
#include<stdio.h>
#include<string.h>
int main(){
char a[200],b[200]={'\0'}; //一定要对字符数组初始化,否则结束符是随机出现的!
scanf("%s",&a);
int i=0,j=0,q=0,m=0,x=0;//x是数的位数
while(a[i]){
if(a[i]<'0'||a[i]>'9'){
b[m]=a[i];
i++;
m++;
}else{
x++;
q=i+1;
int p=a[i]-'0';
while(a[q]>='0'&&a[q]<='9'){ //找字符串中的数
p=p*10+(a[q]-'0');
q++,x++;
}
int len=strlen(b);
for(j=p+1;j<=(len-p)/2+p;j++){ //翻转
char sh=b[j-1];
b[j-1]=b[len+p-j];
b[len+p-j]=sh;
}
i+=x;//读取位置变化
}
}
puts(b);
return 0;
}
另解:
若翻转字符串 b 时,希望将字符串 a 的值代入实现,则要计算 a 读取到当前数字的位置,会繁琐很多
#include<stdio.h>
#include<string.h>
int main(){
char a[200],b[200]={'\0'}; //一定要对字符数组初始化,否则结束符是随机出现的!
scanf("%s",&a);
int i=0,j=0,q=0,m=0,num=0,f[100]={0},count=1,x=0;//x是数的位数
while(a[i]){
if(a[i]<'0'||a[i]>'9'){
b[m]=a[i];
i++;
m++;
}else{
num++,x++;
q=i+1;
int p=a[i]-'0';
while(a[q]>='0'&&a[q]<='9'){ //找字符串中的数
p=p*10+(a[q]-'0');
q++,x++;
num++;
}
f[count]=num;//找到前面的数字占了多少位
int len=strlen(b);
int k=len+f[count-1];
for(j=p;j<len;j++){ //翻转
b[j]=a[k-1];
k--;
}
i+=x;
count++;
x=0;
}
}
puts(b);
return 0;
}