C ++通过数字比较两个数字

时间:2018-10-18 18:48:30

标签: c++ numbers compare digits

我想创建一个函数,只要输入中提供的两个数字由相同的数字组成(不替换),该函数将返回true。

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

我已经读过一些有关位掩码的信息,但并没有真正理解,您能帮我吗?

2 个答案:

答案 0 :(得分:3)

我认为处理此问题的最简单方法是使用存储桶。创建一个长度为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);
}

答案 1 :(得分:1)

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

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;
}