Java实现指定字母数字拼接序列逻辑错误求助
问题分析
首先明确目标序列的核心规律:
- 第k项的数字部分固定为
2*k,每次固定递增2 - 字母部分按A-Z顺序排列,跳过的字母满足:字母序号(A=1,B=2……Z=26)等于两个连续正整数的乘积,即
k*(k+1),对应跳过的字母为B(2=12)、F(6=23)、L(12=34)、T(20=45)等
原代码存在3个问题:
- 未导入
java.util.Scanner依赖,编译会报错 - 循环条件写为
i<=n,输入n时会生成n+1项,和需求不符 - 仅在
a==4时额外跳一次字母,只能跳过第一个要排除的B,后续要排除的F、L等字母没有对应处理逻辑
正确实现代码
通用规则版本(无需硬编码跳过字母)
import java.util.Scanner; public class Test4 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int num = 2; char ch = 'A'; for (int i = 0; i < n; i++) { System.out.print(ch + "" + num + " "); num += 2; ch++; // 通用判断:字母序号是否为连续两个正整数的乘积 int charSeq = ch - 'A' + 1; int sqrtVal = (int) Math.sqrt(charSeq); if (sqrtVal * (sqrtVal + 1) == charSeq) { ch++; } } sc.close(); } }
固定跳过字母版本(适合规则固定的场景)
如果跳过的字母是固定的少量值,可以直接硬编码判断,性能更高:
import java.util.Scanner; public class Test4 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int num = 2; char ch = 'A'; for (int i = 0; i < n; i++) { System.out.print(ch + "" + num + " "); num += 2; ch++; // 直接判断是否为要跳过的字母 if (ch == 'B' || ch == 'F' || ch == 'L' || ch == 'T') { ch++; } } sc.close(); } }
验证结果
输入10时,两个版本的输出均为:A2 C4 D6 E8 G10 H12 I14 J16 K18 M20,完全符合预期。
内容的提问来源于stack exchange,提问作者Dark3963
相关产品推荐
相关产品推荐

