You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:20