Нужно проверить, является ли число почти счастливым

Счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 4 и 7. Число называется почти счастливым, если оно делится без остатка на какое-либо счастливое число. Я написала программу, стала проверять ее на правильность и мне выдало ошибку, что программа не прошла определенный тест. Тест связан с числом 799. Моя программа выдает "NO", а по тесту должно быть "YES". И я не понимаю, почему так. Исходя из условия задачи, моя программа выдает верный ответ. Подскажите, пожалуйста.

using System;

namespace Practics
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = Convert.ToInt32(Console.ReadLine());

            if(AlmostHappyNumbers(num) == true || ContainsOrNotContains(num) == true)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("NO");
            }

        }

        static bool AlmostHappyNumbers(int number)
        {
            if (number % 4 == 0 || number % 7 == 0)
            {
                return true;
            }
            return false;
        }

        static bool ContainsOrNotContains(int number)
        {
            string str = number.ToString();
        
            for(int i = 0; i < str.Length; i++)
            {
                if (str[i] != '4' && str[i] != '7')
                {
                    return false;
                }
              
            }     
            
            return true;
           
        }
        }
    }

Ответы (3 шт):

Автор решения: Иван

Вам нужно перебрать все счастливые номера и поделить принимаемое значение на них, если хотя бы одно из делений происходит без остатка, то ответ "YES".

Это не оптимальный метод решения, но, полагаю, он будет работать:

class Program
{
    static void Main(string[] args)
    {
        string recivedNumber = Console.ReadLine();

        if (IsAlmoustLucky(recivedNumber) == true || IsLuckyNumber(recivedNumber) == true)
            Console.WriteLine("YES");
        else
            Console.WriteLine("NO");
    }

    static bool IsAlmoustLucky(string number)
    {
        int intNumber = (int) number;
       
        for(int i = 4; i <= intNumber; i++)
            if (intNumber % i == 0 && IsLuckyNumber(i.ToString()))
                return true;

        return false;
    }

    static bool IsLuckyNumber(string number)
    {
        for(int i = 0; i < number.Length; i++)
            if (number[i] != '4' && number[i] != '7')
                return false;
        
        return true;
    }
}
→ Ссылка
Автор решения: MarkShcerbakov

Можно сгенерировать все счастливые числа в диапазоне длины исходного числа.

static bool HappyNumber(int number)
{
    if (!$"{number}".Any(c => "47".Contains(c)))
    {
        return false;
    }
    else if ($"{number}".Any(c => "01235689".Contains(c)))
    {
        List<string> res = new();
        List<string> tmp = new() { "" };
        for (int i = 0; i < $"{number}".Length; i++)
        {
            tmp = tmp.SelectMany(c => "47", (c, n) => $"{c}{n}").ToList();
            res.AddRange(tmp);
        }

        return res.Any(i => number % int.Parse(i) == 0);
     }
     else
     {
         return true;
     }
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Вам уже объяснили где у вас ошибка. Я только хочу предложить решение не сложное и быстрое. В диапазоне [1, 231) только 1022 счастливых числа. Быстрее всего их перебрать и попробовать поделить на каждое:

using System;

// по упорядоченному массиву счастливых чисел определённой разрядности
// строит упорядоченный массив счастливых чисел на единицу большей разрядности
// { 0 } ->
// { 4, 7 } ->
// { 44, 47, 74, 77 } ->
// { 444, 447, 474, 477, 744, 747, 774, 777 } ->
// ...
long[] luckys(long[] a) {
    int n = a.Length;
    long[] b = new long[2 * n]; 
    for (int i = 0; i < n; ++i) {
        b[2 * i    ] = 10 * a[i] + 4;
        b[2 * i + 1] = 10 * a[i] + 7;
    }
    return b;
}

bool almost_lucky(int n) {
    long[] a = new long[] { 0 };
    while (true) {
        a = luckys(a);
        foreach (long d in a) {
            // если превысили n, дальше искать нечего
            if (d > n) {
                return false;
            }
            // если делится, ответ найден
            if (n % d == 0) {
                return true;
            }
        }
    }
}

Console.WriteLine(
    (almost_lucky(Int32.Parse(Console.ReadLine()))) ? "YES" : "NO"
);
→ Ссылка