如何在C++中检查自描述数(Self-descriptive Number)?
如何在C++中实现自描述数的检查
要在C++里验证一个数是否是自描述数,我们可以严格遵循自描述数的定义来拆解逻辑,下面是具体的实现思路和代码示例:
核心规则回顾
自描述数是指在给定基数b下长度为b位的整数,其中位置n(最高位为位置0,最低位为b-1)上的数字d,表示该数中数字n出现的次数。比如十进制的
6210001000:它有10位(对应基数10),位置0的数字是6,表示数里有6个0;位置1的数字是2,表示有2个1,以此类推。
实现步骤
- 步骤1:确定基数与长度匹配:自描述数的长度必须等于其基数,所以我们可以直接用输入数字的字符串长度作为基数
b。 - 步骤2:统计数字出现次数:创建一个长度为
b的计数数组,遍历输入的每一位数字,统计每个数字(0到b-1)出现的次数。 - 步骤3:逐位验证规则:遍历每个位置
n,检查该位置的数字是否等于计数数组中n对应的统计次数,全部匹配则为自描述数。
C++代码实现
#include <iostream> #include <vector> #include <string> bool isSelfDescriptive(const std::string& num) { int base = num.size(); // 先检查每一位数字是否合法(小于基数) for (char c : num) { int digit = c - '0'; if (digit < 0 || digit >= base) { return false; } } std::vector<int> count(base, 0); // 统计每个数字出现的次数 for (char c : num) { int digit = c - '0'; count[digit]++; } // 逐位验证是否符合自描述规则 for (int n = 0; n < base; ++n) { int expected = num[n] - '0'; if (expected != count[n]) { return false; } } return true; } int main() { // 测试示例 std::string test1 = "6210001000"; std::cout << test1 << " is self-descriptive? " << std::boolalpha << isSelfDescriptive(test1) << "\n"; // 输出true std::string test2 = "1210"; // 四进制自描述数 std::cout << test2 << " is self-descriptive? " << std::boolalpha << isSelfDescriptive(test2) << "\n"; // 输出true std::string test3 = "123"; std::cout << test3 << " is self-descriptive? " << std::boolalpha << isSelfDescriptive(test3) << "\n"; // 输出false return 0; }
代码说明
- 我们用字符串来处理输入,这样可以直接按索引访问每一位,且方便获取基数(字符串长度)。
- 第一步先验证每一位数字的合法性:数字必须在0到base-1之间,否则直接返回false。
- 计数数组
count的索引对应数字本身,值对应该数字出现的次数。 - 最后遍历每个位置,对比该位置的数字和对应数字的出现次数,全部匹配则返回true。
内容的提问来源于stack exchange,提问作者Kalas Dephik
相关产品推荐
相关产品推荐

