思路很简单,首先要注意任何数的p进制都是基于10进制进行定义的。回顾一下p进制数
(
a
n
a
n
−
1
⋯
a
0
‾
)
p
(\overline{a_na_{n-1}\cdots a_0})_{p}
(anan−1⋯a0)p的定义式:
(
a
n
a
n
−
1
⋯
a
0
‾
)
p
=
∑
i
=
0
n
a
i
p
i
(\overline{a_na_{n-1}\cdots a_0})_{p}=\sum_{i=0}^n a_i p^i
(anan−1⋯a0)p=i=0∑naipi
其中右侧的计算都是基于十进制的。我们再将右侧的十进制结果记作 T = ( t k t k − 1 , ⋯ t 0 ‾ ) 10 T=(\overline{t_kt_{k-1},\cdots t_0})_{10} T=(tktk−1,⋯t0)10,其中的 k k k就是十进制数的位数减一了。
很显然,p进制转10进制的关键就在于获得 a i ( i = 0 , 1 , ⋯ , n ) a_i(i=0,1,\cdots,n) ai(i=0,1,⋯,n)了。而10进制转p进制的关键在于获得 t i ( i = 0 , 1 , ⋯ k ) t_i(i=0,1,\cdots k) ti(i=0,1,⋯k)。由此轻松编程。
Cpp Side
long long int PToTen(long long int num, int p)
{
long long int result = 0;
long long int m = 10, n = 1;
while (m / 10 <= num)
{
result += (num % m) / (m / 10) * n;
m *= 10;
n *= p;
}
return result;
}
long long int TenToP(long long int num, int p)
{
long long int result = 0;
long long int m = p, n = 1;
while (m / p <= num)
{
result += (num % m) / (m / p) * n;
m *= p;
n *= 10;
}
return result;
}
Python Side
Python本身对任意进制转10进制可以通过现成的函数
int
的参数base
来完成,不过10进制转任意进制貌似没有提供现成的函数。
def PToTen(num : int, p : int):
result = 0
m, n = 10, 1
while m // 10 <= num:
result += (num % m) // (m // 10) * n
m *= 10
n *= p
return result
def TenToP(num : int, p : int):
result = 0
m, n = p, 1
while m // p <= num:
result += (num % m) // (m // p) * n
m *= p
n *= 10
return result