Здравствуйте, Vintik_69, Вы писали:
V_>Получилась рекуррентная формула, которую осталось только запрограммировать (с мемоизацией).
Вчера попробовал запрограммировать формулу, но сегодня, запустив, получил в качестве ответа ноль(искал количество чисел, не превосходящих 140, делящихся на 13 и с суммой цифр от 11 до 18), хотя ответ должен получиться "3" (39, 65, 78). Можете указать ошибку? Просто дебажить такое очень трудно.
unsigned func(unsigned i, unsigned q, unsigned s, bool l) {
if(i != 20)
{
unsigned long long temp = 0;
if(l)
{
for (unsigned d = 0; d <= 9; ++d)
temp += func(i + 1, (q * 10 + d) % k, s + d, true);
return temp;
}
else
{
for(unsigned d = 0; d <= aArray[i]; ++d)
temp += func(i + 1, (q * 10 + d) % k, s + d, d < aArray[i]);
return temp;
}
}
else
//p — левая граница суммы цифр, t — правая.
if(q == 0 && p <= s && s <= t)
return 1;
else
return 0;
}
void check() {
num = func(0, 0, 0, false);
cout << num;
}
aArray[i] — i-ая цифра числа 140. Сам массив выглядит так: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0 (17 нулей и 1, 4, 0). aArray[17] = 1, aArray[18] = 4, aArray[19] = 0.