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();
        } 
    }
}
相关推荐
某空m1 小时前
【Android】组件化搭建
android·java·前端
野生技术架构师1 小时前
Java 经典面试题汇总:多线程 +spring+JVM 调优 + 分布式 +redis+ 算法
java·jvm·spring
原野-1 小时前
PHP女程序猿学习Java的Day-5
java·开发语言·学习
Liangwei Lin1 小时前
洛谷 P9241 [蓝桥杯 2023 省 B] 飞机降落
职场和发展·蓝桥杯
重生之我是Java开发战士1 小时前
【Java SE】TCP/IP协议栈:从分层架构到核心机制
java·tcp/ip·架构
CoderYanger1 小时前
递归、搜索与回溯-综合练习:22.优美的排列
java·算法·leetcode·深度优先·1024程序员节
想做后端的前端1 小时前
Lua基本数据类型
java·junit·lua
张人大 Renda Zhang1 小时前
Maven = Java 构建世界的“事实标准”:从 pom.xml 到云原生 CI/CD
xml·java·spring boot·后端·ci/cd·云原生·maven
shayudiandian1 小时前
【Java】内部类
java