黑洞密码【Java】-第8届图灵杯

题目描述

近些日子,某科学家接受到了来自外太空的神秘讯息,在经过了一段时间的研究后,科学家发现讯息是一个由字母和数字组成的字符串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);
		}
}


 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小才在学习Lu_lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值