Согласен. Впервые со стаком столкнулся буквально только что, когда решал задачу про скобки. В итоге на задачу со скобками потратил 2 часа, а на эту минут 5-7
А как решить задачу в 4 строки не подскажите?
Надо учиться решать ПОСТАВЛЕННУЮ задачу.
А как ты решение подглядел?
1017813395526647321
Есть решение в 4 строки.
2 строки на задание переменных, 1 строка подсчет позиции и 1 строка вывода.
Без перебора.
И за что же так не любят Ё???
Это не Вам было, другому Андрею с ID 12465.
Не нашел я в своей программе Write(). Один раз использую WriteLine().
12465. Андрей: В конце вывода Робот ожидает WriteLine(), а у Вас там только Write().
Вероятно из-за того, что простые множители это не только 2,3,5,7. Есть ведь и другие числа.
Засуньте перебор множителей в цикл.
Блин, так не честно...
Можно же было просто написать, что ключевыми являются данные цифры. И не расписывать почему и как.
Зашел на работу, проверить - за 24 часа пройдено 230 циклов по 9.000.000.000 значений... дурной перебор.
Вся оптимизация сводится к выводу формулы согласно свойств чисел. Например: сумма чисел от 1 до 10 равна 55.
Перебором всех решений можно, но уже 10-значные пары вычисляются более 2х часов на кора2дуба Е7500, на одном ядре.
Мой вариант брутфорса, вывел его от скуки:
public class Program
//заморочки с байтами для экономии памяти, решение проверялось в онлайн сервисах.
{ public static void Main()
// а в них сброс задачи при завышении потреблении памяти или процессорного времени.
{ uint st = uint.Parse(Console.ReadLine()); uint ylast = st-1;
byte[] sumA = new byte[st], sumB = new byte[st], cont = new byte[st+st];
sumA[ylast] = 1;
while (sumA[ylast] < 9)
{ Array.Clear(sumB, 0,sumB.Length); sumB[ylast] = 1;
while (sumB[ylast] < 9)
{ byte chk = 1; if (sumB[0] > 9) { rebild_mas(sumB); }
for (byte j = 0; j <= ylast; j++) { if (sumA[j] + sumB[j] > 9) { chk = 0; break;} }
if (chk == 1) { cont[0]++; if (cont[0] > 200) rebild_mas(cont); }
sumB[0]++;
}
sumA[0]++; if (sumA[0] > 9) { rebild_mas(sumA); }
}
Console.WriteLine("{0} ", otvet(rebild_mas(cont)));
}
static byte[] rebild_mas(byte[] summas)
{ byte z = 0; while (z < summas.Length-1)
{ if (summas[summas.Length-1] > 9) { Array.Resize(ref summas, summas.Length+1); }
summas[z + 1] += (byte)(summas[z] / 10);
summas[z] = (byte)(summas[z] % 10); z++;
} return summas; }
static string otvet(byte[] lon)
{ string rez =""; for (int x=lon.Length-1; x >= 0; x--)
{ if (lon[x] == 0 && x > lon.Length-2)continue; else rez += lon[x]; }
return rez; }
}
Своих мозгов хватило на 70% решение... Пришлось подглядывать (2 недели думал).
Вычислять индекс символов для сравнения через остаток от деления - я бы не додумался.
Мюсли рядом крутились, но постоянно выходил за пределы массива.
По сравнению со "скобками" и переводом из "двоичной системы" как-то слишком простая задача.
Hint!
Протестируйте расчет такого числа в bin:
111000011111111111111110001111111111111111111111111000011001
Может буквы нужны большие?
ABCDEF
удаляйте минус из считываемой строки.
if (st.Substring(0,1)=="-") st = st.Remove(0,1);