如何从整数中提取缺失的数字?
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, " "));
您可以使用 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;
}
我正在尝试获得以下输出:
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, " "));
您可以使用 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;
}