P8723 乘法表 题解

· · 题解

这题不需要任何高精,只需要进制转换。

这里只需用到 10 进制转 k 进制,而在程序中我们经常用到短除法取余的方法。举个例子,当 k=3 时,10 进制数 413 的转换过程是这样的:

413\div3=137\cdots\cdots2 137\div3=45\cdots\cdots2 45\div3=15\cdots\cdots0 15\div3=5\cdots\cdots0 5\div3=1\cdots\cdots2 1\div3=0\cdots\cdots1

把余数从下往上连起来,得 120022,事实上,这就是 4133 进制数。

因此我们很容易得到以下代码:

#include <iostream>
#include <algorithm>//reverse要用
using namespace std;
int n;
char trans(int a){
    if(a%n<10) return a%n+'0';
    return a%n+'A'-10;//大于10时用大写字母
}
string ten_to_k(int x){//10进制转k进制
    string a;//字符串存储
    for(int i=0;x>0;i++) a+=trans(x),x/=n;//短除法
    reverse(a.begin(),a.end());//翻转字符串,因为是从下往上
    return a;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<n;i++,putchar(10))
        for(int j=1;j<=i;j++)
            cout<<ten_to_k(i)<<'*'<<ten_to_k(j)<<'='<<ten_to_k(i*j)<<' ';//循环输出
    return 0;
}