整数的展开

本文介绍了十进制计数原理及数的b进制展开方法,并探讨了康托尔展开这一独特数制表示方式。

十进制计数

日常生活中整数最常见的表示形式为十进制。如965,它的值是9*10^2+6*10+5。从最开始接触数字,我们就在用十进制计数,可以确信对于任何一个非负整数n,都可以唯一地表示为如下的形式:

数的展开_html_m945cbdf(公式1)

其中,k是非负整数,数的展开_html_m82111c2是小于10的非负整数(也即0到9)。可以将这个数字的表示简化为数的展开_html_m405528d,这也正是我们所习惯的形式,一般把n称为(k+1)位数,如965是一个3位数。虽然根据经验可以得出,任何一个正整数n,都可以唯一地表示为上面的十进制形式,这里还是简单地证明一下(对下面的另外一种展开会有帮助)。

这里的证明需要分为两部分,一是存在性,二是唯一性。

存在性:对于数的展开_html_m7f04a07d来说,它所能表示的最大数为数的展开_html_6304d6b,如果可以证明它可以表示所有0到数的展开_html_4d8d9eff范围内的整数,就可以证明存在性了。这里采用归纳法:

基础步骤:k=0时,数的展开_html_54d8fb0d可以表示0-9(即0到数的展开_html_m160f3b8)范围内的所有整数;

归纳步骤:假设对于整数m来说,命题成立,这样数的展开_html_12c49e5d可以表示0到数的展开_html_35e153a范围内的所有整数。考虑整数n,它满足数的展开_html_m70595db4,注意到数的展开_html_6f606342,所以存在整数数的展开_html_m352cd680数的展开_html_22c1566),使得数的展开_html_18caf09f,也就是说数的展开_html_m316fbae可以表示所有0到数的展开_html_m3e2eb306范围内的整数。

这样,对于任意正整数n,总可以找到一个十进制数数的展开_html_m405528d来表示,其中k=数的展开_html_m47dbf7a3([]为下取整函数)。

唯一性:可以用反证法证明,这里从略。

nb进制展开

在计算机系统当中,使用更多的还是二进制、八进制和十六进制。上面十进制表示的结论也可以推广到任意的正整数b(b>1),也就是说,对于任意一个非负整数n,都可以唯一地表示为如下的形式:

数的展开_html_m146f58ff(公式2)

这个形式可以称为n以b为基数(base)的展开,或者n的b进制展开,记为数的展开_html_m828b487。当b=2时,也就是我们非常熟悉的二进制展开了,很多时候会遇到这方面的面试题:如何表示一个整数,二进制展开中有多少个1等等。那现在来考虑给定一个正整数n和基数b(b>1),如何求得n的b进制展开呢?通过公式2可以看到,迭代地使用带余除法,直到商为0即可。


  
private static readonly string digitTable = " 0123456789abcdef " ;
private static readonly int maxBase = digitTable.Length;

/// <summary>
/// Base b expansion.
/// </summary>
/// <param name="n"> n >= 0 </param>
/// <param name="b"> b in [2, 16] </param>
/// <returns></returns>
public static string Expansion( int n, int b)
{
Stack
< string > remainders = new Stack < string > ();
do
{
remainders.Push((n
% b).ToString());
n
/= b;
}
while (n > 0 );

return string .Join( string .Empty, remainders.ToArray());
}

如果n=165,b=8,则结果为245。

其它的展开形式

有趣的是,在对一个整数进行展开时,除了上面提到的b进制展开,还有其它形式的展开。比如康托尔(Cantor)展开,它是说对于任意一个非负整数n可以唯一地表示为如下的形式:

数的展开_html_mb061b83,其中数的展开_html_4a726c85为整数,且数的展开_html_m44d5da31,i=1,2,...,n。

这个看起来有点儿不可思议。对于十进制展开来说,我们可以相信它可以连续地表示所有非负整数,而康托尔展开就没那么明显了。现在再次观察十进制展开数的展开_html_m7ed99a95,它为何能够连续地表示整数呢?一个k位数能够表示0到数的展开_html_6304d6b范围内的整数,而数的展开_html_6304d6b的下一个整数整数数的展开_html_m167c4539正好是一个(k+1)位数的最小值,这是关键之处。而它能够唯一地表示整数,在于如果i与j不相等,那么一个i位数和一个j位数就不可能相等,这样可以将所有整数按段来分隔了。

下面来考虑康托尔展开是否具有上段提到的两个性质。对于数的展开_html_76bf8322,可以记为数的展开_html_m476637db,这样仍然可以用一位数、两位数来称呼它们。对于一位数,即k=1时,康托尔展开可以表示的数是0、1;对于两位数,即k=2时,康托尔展开可以表示的数是2、3、4、5;而三位数则可以表示6、7、...、23。看来至少在k不大于3时是可以连续、唯一地表示整数的。一般地,等式2011031402351113.gif成立(可以用数学归纳法证明),而这一等式使得康托尔展开就跟上段提到的十进制展开的两个性质非常类似,这样就可以初步确定康托尔展开可以唯一地表示任意的非负整数了,详细的证明过程与十进制展开的证明类似,不再赘述。

参考:
离散数学及其应用
数据结构与问题求解

### 整数序列在数据结构算法中的应用 整数序列是一种常见的数据形式,在数据结构算法领域具有广泛的应用。以下是关于整数序列的一些核心概念及其在不同场景下的具体操作。 #### 1. 序列的概念 整数序列是由一系列按一定顺序排列的整数组成的数据集[^1]。这种有序性使得整数序列成为许多算法设计的基础,尤其是在涉及栈、队列或其他线性数据结构的操作时尤为重要。 #### 2. 基于整数序列的经典问题 一些经典的算法问题围绕着整数序列展开,例如验证栈的弹出顺序是否合法。这类问题通常可以通过辅助数据结构(如栈)来解决。以下是一个具体的例子: ##### 判断栈的弹出顺序合法性 给定两个整数序列 `pushA` 和 `popA`,分别表示栈的压入和弹出顺序,需判断后者是否为前者的一个可能弹出序列。此问题的核心在于模拟栈的行为并利用其后进先出 (LIFO) 的特性。 ```java import java.util.Stack; public class Solution { public boolean IsPopOrder(int[] pushA, int[] popA) { if (pushA.length == 0 || popA.length == 0) return false; Stack<Integer> stack = new Stack<>(); int popIndex = 0; // 标识弹出序列的位置 for (int i = 0; i < pushA.length; i++) { stack.push(pushA[i]); while (!stack.isEmpty() && stack.peek() == popA[popIndex]) { stack.pop(); popIndex++; } } return stack.isEmpty(); // 如果最终栈为空,则说明弹出序列合法 } } ``` 上述代码通过维护一个辅助栈来逐步模拟压入和弹出过程,并检查两者是否匹配[^3]。 #### 3. 动态规划中的整数序列处理 动态规划是一类重要的算法思想,常用于求解最优化问题。其中,基于整数序列的状态转移方程是解决问题的关键之一。例如,最长递增子序列 (Longest Increasing Subsequence, LIS) 是典型的动态规划问题。 ```python def length_of_LIS(nums): if not nums: return 0 dp = [1] * len(nums) for i in range(1, len(nums)): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1) return max(dp) # 示例调用 nums = [10, 9, 2, 5, 3, 7, 101, 18] print(length_of_LIS(nums)) # 输出:4 ``` 在此示例中,`dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度。通过对整个序列进行两层遍历,可以构建状态转移矩阵并得出最优解[^2]。 #### 4. 图论中的整数序列应用 图论也是研究整数序列的重要方向之一。例如,邻接表或边权值列表均可以用整数序列的形式表达节点之间的连接关系。此外,拓扑排序等问题也依赖于对整数序列的有效管理和计算。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值