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 的数字用大写字母 A、B、C、 ⋯ \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();
}
}
}