Powinno być całkiem szybko. Przerobienie na ew. odpowiedź do zadania to już Twoja sprawa :-)
#include <iostream>
#include <string>
#include <numeric>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <set>
// Mały Bonus... jak będziesz chciał wyjść poza zakres POD'ów
// i uzyskać 100% punktacji, ta funkcja może być punktem startu...
bool check17DivideEnded7(const std::string& value) {
// Sprawdzenie czy kończy się na 7. Od razu obliczenie do
// sprawdzenia warunku podzielności przez 17'cie.
int lastValue = (*value.crbegin() - '0') * 5;
if(35 != lastValue) {
return false;
}
// Sumuje cyfry reprezentowane w string'u bez ostatniej.
int sum = std::accumulate(value.cbegin(), value.cend() - 1, '0',
[](char a, char b) {
return a + b - '0';
}) - '0' - lastValue;
return ! (sum % 17 % 10);
}
std::set<int> findValues(int value) {
constexpr static int gcd17and7 = 17 * 7;
std::set<int> values;
int computeValue;
int i = 0;
int correctionTable[] = {1, 4, 7, 0, 3, 6, 9, 2, 5, 8};
while((computeValue = (i * gcd17and7 + correctionTable[i % 10] * 17)) < value) {
++i;
values.insert(computeValue);
}
return values;
}
void showSet(const std::set<int>& values) {
std::copy(values.cbegin(), values.cend(),
std::ostream_iterator<int>(std::cout, ", "));
}
int main() {
int value;
std::cout << "Podaj liczbę: ";
std::cin >> value;
auto values = findValues(value);
std::cout << "Poniżej tej wartości jest " << values.size()
<< " liczb spełniających krtreria.\n";
std::cout << "Są to: ";
showSet(values);
std::cout << std::endl;
}