P8723 [蓝桥杯 2020 省 AB3] 乘法表——Java解答

P8723 [蓝桥杯 2020 省 AB3] 乘法表

题目描述

九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。

例如, 四进制下的乘法表如下所示:

复制代码
1*1=1
2*1=2 2*2=10
3*1=3 3*2=12 3*3=21

请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。

给定 P P P,请输出 P P P 进制下的乘法表。

输入格式

输入一个整数 P P P。

输出格式

输出 P P P 进制下的乘法表。 P P P 进制中大于等于 10 10 10 的数字用大写字母 ABC、 ⋯ \cdots ⋯ 表示。

输入输出样例 #1

输入 #1

复制代码
4

输出 #1

复制代码
1*1=1
2*1=2 2*2=10
3*1=3 3*2=12 3*3=21

输入输出样例 #2

输入 #2

复制代码
8

输出 #2

复制代码
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=11
4*1=4 4*2=10 4*3=14 4*4=20
5*1=5 5*2=12 5*3=17 5*4=24 5*5=31
6*1=6 6*2=14 6*3=22 6*4=30 6*5=36 6*6=44
7*1=7 7*2=16 7*3=25 7*4=34 7*5=43 7*6=52 7*7=61

说明/提示

对于所有评测数据, 2 ≤ P ≤ 36 2 \leq P \leq 36 2≤P≤36。

蓝桥杯 2020 第三轮省赛 AB 组 G 题。
洛谷链接

一、知识点

1.字符与数字的映射关系

在 Java 中,char 类型本质上是一个 16 位的 Unicode 字符,但我们可以利用 ASCII 编码中字符的连续性来快速实现数字到字符的转换。

下面我给出数字和字母的ASCII 编码表,我们只需要就记住首个码位就行

字符 码位
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90

数字 → 字符(0~9)

java 复制代码
int num = 7;
char c = (char)('0' + num);  // '7'

数字 → 字母(10~35)

java 复制代码
int num = 12;
char c = (char)('A' + (num - 10));  // 'C'

2. 进制转换的核心:除基取余法 + 字符映射

我们以将十进制数 n 转换为 P 进制字符串为例,步骤如下:

不断除以 P,取余数;

将余数映射为字符;

拼接字符; 逆序得到结果。

java 复制代码
//将 123 转换为 16 进制
123 ÷ 16 = 7            余 11 → 'B'
7 ÷ 16 = 0              余 7 → '7'
结果:"7B"

3.StringBuilder 的使用

由于进制转换是从低位到高位计算的,我们需要逆序拼接字符,这时用 StringBuilder 的 reverse() 方法非常方便。

java 复制代码
StringBuilder sb = new StringBuilder();
sb.append('A');
sb.append('1');
System.out.println(sb.reverse().toString());  // 输出 "1A"

二、思路讲解及代码

读入进制 P

双重循环输出乘法表
外层 i 从 1 到 P-1
内层 j 从 1 到 i 将 i、j、i * j 转换为 P 进制字符串

java 复制代码
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.Scanner;

public class Main {

   //转换进制
    public static String toBase(int value, int P){

        if (value == 0){
            return String.valueOf('0');
            //valueOf()把基本类型快速变成字符串
        } 
        StringBuilder sb = new StringBuilder();
        while(value>0){
            int temp = value % P;
            char ch ;
            if(temp < 10){
                ch = (char)('0' + temp);
            }else{
                ch = (char)('A' + (temp - 10));
            }
            sb.append(ch);
            //拼接字符串
            value /= P;
        }
        return sb.reverse().toString();
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int P = sc.nextInt();
        for (int i = 1;i < P;i++){
            for(int j = 1;j <= i;j++){
                System.out.print(toBase(i,P) + "*" + toBase(j,P) + "=" + toBase(i*j,P) + " ");
            }
            System.out.println();
        } 
    }
}
相关推荐
枫叶落雨2227 小时前
ShardingSphere 介绍
java
花花鱼7 小时前
Spring Security 与 Spring MVC
java·spring·mvc
言慢行善8 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星8 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟8 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z8 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可8 小时前
Java 中的实现类是什么
java·开发语言
He少年8 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新8 小时前
myeclipse的pojie
java·ide·myeclipse
迷藏4949 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构