如何从整数中提取缺失的数字?

How do I extract missing digits from an integer?

我正在尝试获得以下输出:

Enter integer: 87240

Missing digits: 1 3 5 6 9

到目前为止,这是我的代码:

// Extract numbers inside integer n

while (numOfDigits > 0)
{    
    int digit = n % 10;

    int missing = 0;

    while ((digit != missing) && (missing < 10))
    {
        cout << missing << " ";
        missing++;
    }

    numOfDigits--;
    n /= 10;
}

打印出

Enter integer: 87240

Missing digits: 0 1 2 3 0 1 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7

有没有什么方法可以在不使用数组的情况下做到这一点?

您是否有兴趣使用 string 而不是数组?那些 或多或少是相同的想法,但给定输入 string n 我们可以找到任何未使用的数字,如下所示:

const auto digits = "0123456789"s;

sort(begin(n), end(n));
set_difference(cbegin(n), cend(n), cbegin(digits), cend(digits), ostream_iterator<char>(cout, " "));

Live Example

您可以使用 for 循环,不需要数组:

#include <string>
#include <iostream>
#include <cstdlib>

int main()
{
  std::string integer;
  std::cout << "Enter integer: ";
  std::getline(std::cin, integer);
  for (unsigned int i = 0; i < 10; ++i)
  {
    const char c = '0' + i;
    if (integer.find(c) == std::string::npos)
    {
      cout << i << " ";
    }
  }
  return EXIT_SUCCESS;
}

以上版本保留了文本形式的数字,更容易搜索数字。
您可以使用嵌套循环来检查数字的每个数字。

这个没有数组。

#include <stdio.h>

int NumHasDigit(int num, int digit)
{
    while (num)
    {
        if (num%10 == digit) 
        {
            return 1;
        }
        num /= 10;
    }   
    return 0;
}

int main(void) {
    int x;

    printf("Enter int: ");
    scanf("%d\n", &x);

    printf("Missing Digits:\n");
    for(int i=0; i<10; ++i)
    {
        if (!NumHasDigit(x,i)) printf("%d ", i);
    }

    return 0;
}

示例输入:
34567

示例输出:
Missing Digits
0 1 2 8 9

这是一个使用单个整数 (acc) 来记住哪些数字已被看到的实现:

#include <iostream>

using uuint = unsigned long long int;

uuint p(uuint n) { ++n; return n * n - n + 41; }

void print_missing(uuint n)
{
    std::cout << "Number " << n << " is missing the following digits:";
    uuint acc = 1;
    while (n)
    {
        uuint q = p(n % 10);
        if (acc % q != 0) acc *= q;
        n /= 10;
    }
    for (int i = 0; i != 10; ++i)
    {
        if (acc % p(i) != 0) std::cout << " " << i;
    }
    std::cout << "\n";
}

int main()
{
    for (uuint n; std::cin >> n; )
        print_missing(n);
}

这里的版本使用单个整数来累积结果(仍然是技术上的位数组):

#include <iostream>
#include <cmath>

void check(int n)
{
    unsigned short bits = 0;
    while (n) {
        bits |= 1 << std::abs(n % 10);
        n /= 10;
    }
    std::cout << "Missing digits:";
    for (unsigned i = 0; i != 10; ++i) {
        if (((bits >> i) & 1) == 0)
            std::cout << " " << i;
    }
    std::cout << std::endl;
}

int main()
{
    int n;
    std::cout << "Enter a number: ";
    std::cin >> n;
    check(n);
    return 0;
}