C ++ сравнивает два числа по их цифрам - PullRequest
0 голосов
/ 18 октября 2018

Я хочу создать функцию, которая возвращает true, когда два числа, представленные на входе, состоят из одинаковых цифр (без замены).

Например, 543 и 435 должны возвращать true, 10001 и11000 должен возвращать true, но 111222 и 122222 должны возвращать false.

Я читал кое-что о битовых масках, но не понял, не могли бы вы мне помочь?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Два числа 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;
}
0 голосов
/ 18 октября 2018

Самый простой способ справиться с этим - использовать ведра.Создайте std::vector длиной 10 (по одному на каждую цифру), а затем увеличивайте индекс всякий раз, когда вы сталкиваетесь с соответствующей цифрой.Готово, сравнивая векторы:

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