Задача - найти все натуральные числа, не превосходящие заданное число N и делящиеся нацело на каждую из своих цифр
Дошел до такого кода:
#include
int main()
{
int n = 0;
cout << "Enter n: ";
cin >> n;
int n1 = n;
for (int i = 1; i < n; i++) {
int length = 0;
while (n != 0) { //Узнаем длину числа
length++;
n /= 10;
}
int *mas = new int[length];
while (n1 != 0) {
mas[i] = n1 % 10; //добавляем цифры числа в массив
n1 /= 10;
}
bool t = true;
for (int a = 0; a < length; a++) {
if (i%mas[a] != 0) {
t = false; //проверяем, делится или нет
}
}
if (t == true) {
cout << i<< " ";
}
}
return 0;
}
Но всё равно не работает. В чём проблема?
Ответ
Как-то уж очень сложно у вас...
bool test(int i)
{
bool dig[9] = {false};
int k = i;
while(k)
{
int d = k%10;
k /= 10;
if (d == 0 || dig[d-1]) continue;
dig[d-1] = true;
if (i%d) return false;
}
return true;
}
int main(int argc, const char * argv[])
{
int N;
cin >> N;
for(int i = 1; i <= N; ++i)
{
if (test(i)) cout << i << endl;
}
}
Это если хочется сэкономить на проверках и не проверять дважды одну и ту же цифру, но для реальных чисел это особой роли не играет, так что сократить можно до
bool test(int i)
{
int k = i;
while(k)
{
int d = k%10;
k /= 10;
if (d && i%d) return false;
}
return true;
}
Комментариев нет:
Отправить комментарий