2 条题解
-
0SunSun LV 6 @ 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;
} -
02023-10-29 14:36:53@
看注释,再看不懂看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
- 上传者