【问题标题】:C++ comparing two numbers by their digitsC ++按数字比较两个数字
【发布时间】:2018-10-18 18:48:30
【问题描述】:

我想做一个函数,只要输入中提供的两个数字由相同的数字组成(没有替换),它就会返回 true。

例如,543 和 435 应该返回 true,10001 和 11000 应该返回 true,但 111222 和 122222 应该返回 false。

我读过一些关于位掩码的文章,但不太明白,你能帮帮我吗?

【问题讨论】:

  • 您可以计算每个数字在数字中出现的次数,或者您可以尝试对数字进行排序,然后比较值。
  • 如果您使用x % 10,它会为您提供底部数字。如果您使用x / 10,它将删除底部数字。然后,您可以对每个数字中的数字进行计数或排序并进行比较。
  • 将数字转换为 std::string 并使用 std::map 或只是一个 int 数组[10];
  • "我读过一些关于位掩码的文章,但并不真正明白" 这不是位掩码的用例。它们用于完全不同的目的。你做了什么尝试?可以将数字拆分为数字,将它们放入std::map,然后比较地图。
  • 我投票决定将此问题作为题外话结束,因为没有尝试解决该问题。没有写出对未来用户没有帮助的答案,我们只能发表评论。

标签: c++ numbers compare digits


【解决方案1】:

我能想到的最简单的处理方法是使用存储桶。创建一个长度为 10 的 std::vector(每个数字一个),然后在遇到相应数字时增加一个索引。通过比较向量来完成:

bool compare_digits(int x, int y) {
    std::vector<int> x_vec(10), y_vec(10);
    while(x != 0) { //!= instead of > so that we can handle negatives
        x_vec.at(x%10)++; //increment whatever digit is in the 1's place
        x /= 10; //chop off the 1's place digit
    }

    while(y != 0) { //repeat for y
        y_vec.at(y%10)++;
        y /= 10;
    }

    //check if they had the same digits
    return (x_vec == y_vec);
}

【讨论】:

  • 我认为没有必要对模运算使用边界检查。如果你不想创建单独的函数只使用 lambda,代码重复是问题的根源。
  • @Slava 我假设当您谈论边界检查时,您指的是我在下标运算符上使用.at()?我不认为它会真正影响这里的运行时,这对于一个初露头角的 C++ 程序员来说可能是一个好习惯,所以我不认为我会改变它。你说我应该 lambda 什么?
  • " 这可能是一个好习惯" 我不这么认为,它与 C++ 的主要原则之一“我不应该为我不使用的东西付费”相冲突。对于 lambda,我的意思是将 int 转换为向量的重复代码
  • @Slava 这是保险。你可以用,也可以不用。在你真正需要它之前,你不会知道是否需要使用它。到那时已经太晚了。我宁愿让我所有的下标.at() 以极低的价格运行到运行时,因为它可以节省我 5 个小时的调试时间。
【解决方案2】:

如果每个数字的计数(出现次数)相同,则由相同数字组成的两个数字。这是一些通用基础的代码(模板参数)

template<int base=10>
bool compare_digits(int x, int y)
{
    // 0 exclude trivial cases
    if(x > base*y || y > base*x)
        return false;
    // 1 count occurrences of digits in x
    int count[base]={0};
    for(; x; x/=base)
        ++ count[x%base];
    // 2 subtract counts of digits in y, if result < 0: return false
    for(; y; y/=base)
        if(--count[y%base] < 0)
            return false;
    // 3 check that count[]==0
    for(int i=0; i!=base; ++i)
        if(count[i]) return false;
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2018-12-03
    • 2015-03-31
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多