102 翻译字符串
问题描述 :
在现代战争中,情报战越来越显示出它的重要性,敌我双方都想方设法得到对方的情报,然后一举歼灭对方。然而,随着加密技术的出现,对情报进行加密变得越来越频繁,想破解敌方的情报也越来越难。明明是一名富有经验的情报工作人员,他的主要任务就是破解敌方的情报,从而得到对己方有利的信息。在一次破解情报任务中,明明再次成功地破解了敌方的情报。明明的破解方法如下:一串以‘@’为结束标志的字符串,从左至右对其进行翻译,若字符串中当前字符是整数n(0≤n≤9),则表示将后一个字符重复n+1次,不论后一个字符是否为数字,且后一个字符无需再次翻译;若当前字符非数字,则表示自己,无需翻译,直接输出即可。最后,输出翻译完的字符串。
例如字符串为:2d352d@,因为第一个字符为数字2,则将后一个字符d输出3次,而d则不需再翻译,然后翻译3,3也是一个数字,则将后一个字符5输出4次,而5则不需再翻译,然后翻译2,2也是一个数字,将后一个字符d输出3次,而d则不需再翻译,最后一个字符为@,表示自己,直接输出即可,最后的输出为:ddd 555 5dd d@;(注:在翻译时,‘@’当作字符处理。) 这样翻译字符串的方法虽然简单,但是由于敌方的文件巨大,仅仅靠手工翻译是很难在短时间内完成的。于是明明就求助于你这位程序专家,按照明明提供的破译方法写一个程序,帮助明明快速把敌方文件翻译完成。
明明的问题可以归结为:按照文中提供的破译情报的方法,对字符串进行翻译,然后输出翻译后的字符串。
输入说明 :
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行包含一个以‘@’为结束标志的字符串,字符串由数字、小写字母以及‘@’组成,中间不包含空格,字符串长度不大于10。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果为经过翻译的字符串,字符串中的字符以三个为一组输出,每组字符之间用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
输入范例 :
a1b2c3d4@
2d352d@
dsegweg@
输出范例 :
abb ccc ddd d@@ @@@
ddd 555 5dd d@
dse gwe g@
思想:用一个flag位来保存当前的位置是读取数据还是输出数据,注意处理每三位的空格和末尾不能有空格。
#include <stdio.h> #include <string.h> int main() { int i, j, k; char s[10]; int enter= 0; while (scanf("%s", &s) != EOF) { if(enter){ //控制末行不打印换行符 移到第二组开始输出的数据上方换行 printf("\n"); } int flag =0; k = 0; //用来计数当前字符是否是3的倍数 int temp = 0; for(i=0;i<strlen(s);i++){ if(flag){ for(j=0;j<temp;j++){ printf("%c",s[i]); k++; if(k%3==0){ if(i==(strlen(s)-1)){ //如果当前遍历的数是末尾的字符 if(j!=(temp-1)){ //如果当前遍历的不是最后一次,那么就输出空格 printf(" "); } }else{ printf(" "); } } } flag = 0; temp = 0; }else{ if(s[i]>='0'&&s[i]<'9'){ flag = 1; temp = s[i]-48+1; // 后面那个字符输出的次数 }else{ printf("%c",s[i]); k++; if(k%3==0&&i!=(strlen(s)-1)){ //后面那个条件是为了消去末尾的空格 printf(" "); } } } } enter= 1; } }

浙公网安备 33010602011771号