加密文书(在字符串中读取数字,完成翻转)

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;
	}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值