题目描述
九九乘法表是学习乘法时必须要掌握的。
在不同进制数下,需要不同的乘法表。
例如,四进制下的乘法表如下所示:
11=1
21=2 22=10
31=3 32=12 33=21
请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。
给定 P,请输出 P 进制下的乘法表。
输入格式
输入一个整数 P。
输出格式
输出 P 进制下的乘法表。
P 进制中大于等于 10 的数字用大写字母 A、B、C、⋯ 表示。
数据范围
2≤P≤36
输入样例1:
4
输出样例1:
11=1
21=2 22=10
31=3 32=12 33=21
输入样例2:
8
输出样例2:
11=1
21=2 22=4
31=3 32=6 33=11
41=4 42=10 43=14 44=20
51=5 52=12 53=17 54=24 55=31
61=6 62=14 63=22 64=30 65=36 66=44
71=7 72=16 73=25 74=34 75=43 76=52 77=61
算法1
(模拟) $O(n*n)$
1.模拟输出
2.注意>10要偏移计算,’A’+r-10;
3.f(i,j)转化为字符串来计算,string 拼接后reverse掉,每次拼接用get()来计算字符放回字符‘10’或者返回‘A’
时间复杂度
参考文献
C++ 代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string name;
int n;
char get(int r)//判断r是否大于为10,大于10的判偏移量和‘A’
{
if(r>=10) return 'A'+r-10;
else
{
return r+'0';//放回数字的字符型
}
}
string f(int m)
{
string name;
while(m)
{
name=name+get(m%n);//拼接
m/=n;
}
reverse(name.begin(),name.end());//反转
return name;
}
int main()
{
cin>>n;
for(int i=1;i<n;++i)
{
for(int j=1;j<=i;++j)
{
if(i>=10)
{
if(j<10)
{
cout<<(char)(i-10+'A')<<"*"<<j<<"="<<f(i*j)<<" ";
}
else
{
cout<<(char)(i-10+'A')<<"*"<<(char)(j-10+'A')<<"="<<f(i*j)<<" ";//大于10的话就用偏移来做
}
}
else
{
cout<<i<<"*"<<j<<"="<<f(i*j)<<" ";
}
}
cout<<endl;
}
return 0;
}