题目描述
近些日子,某科学家接受到了来自外太空的神秘讯息,在经过了一段时间的研究后,科学家发现讯息是一个由字母和数字组成的字符串str,想要破译,需要通过一定的规则将字符串进行转换。规则如下:
1.确定讯息的长度为32;
2.字符串中第4n+1∼4n+4的字母和第4n+1∼4n+4(0≤n≤3)的数字为一组,共4组;
3.每组的第1,2,3,4个字符分别往后推每组第1,2,3,4个数字个数 例:如第一个字母为a,第一个数字为3,转换后变为d,‘z’之后是’B’,‘Z’之后是’b’;
4.将每组内部字母的顺序颠倒;
5.将四组字符合并就是最后的讯息。
输入描述
输入一个长度为32的字符串
输出描述
输出转换后的密码
样例输入
Zzc6Ltw2OD4yR640263W7G8G30HW9C71
样例输出
RgCgJQwxJfYCDeQG
个人思路:
刚拿到这个题觉得大致分几个步骤
1.将字母与数字分开(stringbuffer或数组)
2.字母对应的数字进行一一转化,大写变大写,小写变小写,当字母为Z/z时,需要转化为B/b,利用ASCII码值A-Z 65-90 a-z 97-112 进行转换(后来发现写不出来)
3.四个四个分组,再用stringbuffer反转输出
(第二步思路自己写不出来,参考下面答案整理出java解题步骤)
(4条消息) 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——K题 黑洞密码_<Running Snail>的博客-CSDN博客
Java代码:
遇到的问题:string.charAt()取得的数字,用到循环上,一直不是想要的结果.
最后发现相差48.
原因如下:
Java中charAt()中数值转换为什么要减48
1、charAt的作用是返回字符串指定位置的char值。如果s=“102”。那么chatAt(0)=‘1’,这个‘1’是字符,不是数字。
2、为啥-48,其实是为了转换为数字。
字符’0’的ascii码是48
数字0的值是0
所以’0’和0差48
以此类推
一个字符转换对应的值,就要减去48。
import java.util.Scanner;
public class HDMM {
public static void main(String [] args){
Scanner scanner=new Scanner(System.in);
String string=scanner.next();
StringBuffer string1=new StringBuffer();//数字
StringBuffer string2=new StringBuffer();//字母
char[] string3=new char[16];//记录转换后的字母
//字母与数字分好队,16个数字,16个字母
for(int i=0;i<string.length();i++){
if(Character.isDigit(string.charAt(i)))//字符是否为数字
string1.append(string.charAt(i));
else {
string2.append(string.charAt(i));
}
}
//把字母看作一体,针对数字进行转换,普遍字母往后加数字;
for(int i=0;i<string2.length();i++){
string3[i]=string2.charAt(i);
}
//string1.cahrAt(i)不能转为标准数字
//为什么减48!!!!!!!!!!!!!!!!!!!以解答
for(int i=0;i<string2.length();i++){
for(int k=0;k<(int)string1.charAt(i)-48;k++)
{
if (string3[i]=='z') string3[i]='B';
else if (string3[i]=='Z') string3[i]='b';
else string3[i]=(char)(string3[i]+1);
}
}
StringBuffer stringBuffer=new StringBuffer();
StringBuffer s=new StringBuffer();
//加进去StringBuffer,每四个一组反转,字符串相加
for(int i=0;i<string2.length();i++){
s.append(string3[i]);
if((i+1)%4==0){
s.reverse();
stringBuffer.append(s);
s.delete(0,4);
}
}
System.out.print(stringBuffer);
}
}