我正试图编写一个代码,将接受整数输入,然后使用在输入的整数中找不到的数字计算可能的最小数字。可能的数字是0-9,但是0不能作为输出的前导值。
例如,如果用户输入:
6789年程序将输出:
102345年我该如何解决这个问题?
任何一组数字(暂时忽略零的问题)中可能的最小数依次包含这些数字;因此,从数字2
,1
,6
和3
中,最小的数字是1236
。
因此,我们可以从所有数字的列表开始,按顺序,然后遍历给定输入数字中的数字(在我们将其转换为字符串之后),从列表中删除这些数字(如果它仍然在列表中)。如果最终得到一个第一个元素为0的列表,只需将其与第二位数字交换即可。
这是一个可能的实现:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string numbs = "0123456789";
int input;
std::cout << "Enter a number: ";
std::cin >> input;
std::string check = std::to_string(input); // Convert our input to a string
for (auto digit : check) { // Remove each digit in that from our list...
size_t p;
if ((p = numbs.find(digit)) != std::string::npos) numbs.erase(p, 1);
}
// A basic error check that at least one digit remains ...
if (numbs.length() == 0) {
std::cout << "No digit left with which to make a number!n";
return 1;
}
// Swap first two digits if first is zero and there is at least one other ...
if (numbs[0] == '0' && numbs.length() > 1) std::swap(numbs[0], numbs[1]);
int answer = std::stoi(numbs);
std::cout << answer << std::endl;
return 0;
}
在这个例子中,我使用了标准库中的std::string
容器类;从很多方面来看,这就像一个字符数组;但是,如果您想使用实际的数组,您可以很容易地调整所示代码来使用它们。
又是一个实现。与Adrian的算法相同…
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
int main() {
// Basic string
std::string allDigits{ "0123456789" };
// Get input. Digits only
if (std::string input{}; std::getline(std::cin, input) and std::all_of(input.begin(), input.end(), std::isdigit)) {
// Erase from the allDigits string the characters that are in the input string
std::erase_if(allDigits, [&](const char d) { return std::any_of(input.begin(), input.end(), [d](const char c) { return c == d; }); });
// Take care of leading 0
if ((allDigits.length() > 1) and allDigits.front() == '0') std::swap(allDigits[0], allDigits[1]);
// Show result
std::cout << allDigits << 'n';
}
else std::cerr << "n*** Error: Invalid inputnn";
}