2 条题解

  • 0
    @ 2024-01-25 13:02:03

    //x的n次方 k进制表示
    #include <iostream>
    using namespace std;

    void Mul(int x, int n, int k) {
    int a[100000] = { 0 }; // 存储计算结果的数组,初始为全零
    int b = 0; // 进位数
    a[99999] = 1;

    // 高精度幂运算
    for (int i = 0; i < n; i++) {
    int j = 99999;
    while (j >= 0) {
    // 计算当前位的乘积并加上进位数
    a[j] = a[j] * x + b;
    b = a[j] / k; // 计算进位数
    a[j] = a[j] % k; // 余数作为a[j]
    j--;
    }
    }

    int s;
    // 找到第一个非零数字的位置
    for (s = 0; s < 100000; s++) {
    if (a[s] != 0)
    break;
    }

    if (s == 100000) { // 特判结果为 0 的情况
    cout << '0';
    }
    else {
    while (s < 100000) {
    if (a[s] < 10) {
    cout << a[s];
    }
    else {
    cout << static_cast<char>('A' + a[s] - 10);
    }
    s++;
    }
    }
    }

    int main() {
    int x, n, k;

    cin >> x >> n >> k;

    Mul(x, n, k);

    return 0;
    }

  • 0

    看注释,再看不懂看A11-1那题
    #include<iostream>
    #define N 100010
    using namespace std;
    int a[N], b[N];
    inline int Mul(int a[], int lena, int b[], int lenb, int k)
    {//整个模板和A11-1那题的高精度一模一样,只不过把所有的十进制存储的地方换成K即可
    int c[N] = { 0 };
    int lenc = lena + lenb;
    for (int i = 0; i < lena; i++)
    {
    for (int j = 0; j < lenb; j++)
    {
    c[i + j] += a[i] * b[j];
    c[i + j + 1] += c[i + j] / k; //进位时/k
    c[i + j] %= k; //留位
    }
    }
    if (c[lenc-1] == 0 && lenc > 0)
    lenc--;
    for (int i = 0; i < lenc; i++)
    a[i] = c[i];
    return lenc;
    }
    int main()
    {
    int i = 0, x, n,k;
    int len, lena;
    cin >> x >> n >> k;
    while (x > 0)
    {
    a[i] = x % k;
    b[i] = x % k;
    x /= k;
    i++;
    }
    len = lena = i;
    for (int i = 1; i < n; i++)
    lena = Mul(a,lena,b,len,k);
    for (int i = lena-1; i >= 0; i--)
    switch (a[i])
    {//输出时对应即可,这题默认了最高16进制
    case 0:cout<<"0";break;
    case 1:cout<<"1";break;
    case 2:cout<<"2";break;
    case 3:cout<<"3";break;
    case 4:cout<<"4";break;
    case 5:cout<<"5";break;
    case 6:cout<<"6";break;
    case 7:cout<<"7";break;
    case 8:cout<<"8";break;
    case 9:cout<<"9";break;
    case 10:cout<<"A";break;
    case 11:cout<<"B";break;
    case 12:cout<<"C";break;
    case 13:cout<<"D";break;
    case 14:cout<<"E";break;
    case 15:cout<<"F";break;//反向输出结果
    }
    return 0;
    }

  • 1

信息

难度
6
分类
(无)
标签
递交数
213
已通过
57
通过率
27%
被复制
8
上传者