Нужно проверить, является ли число почти счастливым
Счастливыми являются положительные целые числа, в десятичной записи которых содержатся только счастливые цифры 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;
}
}
Можно сгенерировать все счастливые числа в диапазоне длины исходного числа.
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;
}
}
Вам уже объяснили где у вас ошибка. Я только хочу предложить решение не сложное и быстрое. В диапазоне [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"
);