p进制转10进制,10进制转p进制(C++/Python)

思路很简单,首先要注意任何数的p进制都是基于10进制进行定义的。回顾一下p进制数 ( a n a n − 1 ⋯ a 0 ‾ ) p (\overline{a_na_{n-1}\cdots a_0})_{p} (anan1a0)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 (anan1a0)p=i=0naipi

其中右侧的计算都是基于十进制的。我们再将右侧的十进制结果记作 T = ( t k t k − 1 , ⋯ t 0 ‾ ) 10 T=(\overline{t_kt_{k-1},\cdots t_0})_{10} T=(tktk1,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

猜你喜欢

转载自blog.csdn.net/weixin_45576923/article/details/115190521