Простейший тест на простоту - пробное деление: учитывая входное число n, проверьте, делит ли любое простое число m от 2 до √n поровну
blockquote>Я бы начал с определения функции, которая просто проверяет, является ли число простым или нет. Затем используйте эту функцию в цикле, который считает от 3, 5, 7, 9, ..., 999,999 и проверьте, является ли каждое число простым, если оно совпадает, затем добавьте его в переменную суммы.
from math import sqrt def is_prime(num): # According to trial division we only need to check from 2 -> sqrt(num) for x in range(2, int(sqrt(num) + 1)): if num % x == 0: return False return True sum = 2 # Start with 2 in sum because we skip it to make life easier for x in range(3, 1000000, 2): # Don't bother checking even numbers if is_prime(x): sum += x print("Sum: " + str(sum))
На моем компьютере это занимает около 10 секунд, чтобы найти ответ, который немного лучше, чем ваша реализация.
Чтобы запустить это только для текущего пользователя, вы можете использовать WMI для получения информации при завершении работы / выходе из системы.
Либо вы пишете небольшой C # (или любой другой язык, который может используйте приложение WMI) или сценарий vbs для прослушивания события WMI Win32_ComputerShutdownEvent .
Пример приложения C # можно найти здесь в этом вопросе: Получить событие выхода из системы
Предупреждение, как сказано здесь, gpedit.msc
позволит Вам настраивать сценарий выхода из системы для всех пользователей.
При необходимости в том сценарии только для одного пользователя необходимо объявить это непосредственно в реестре, обоих в HKCU
и HKLM
.
найденный в первом результате на Google для меня
Для выполнения программы, можно создать сценарий, чтобы выполнить его и использовать групповую политику для осуществления его. В Групповой политике Редактор перешли к Пользовательской Конфигурации-> Windows Settings-> Сценарии (Вход в систему/Выход из системы)
Что вам нужно, так это реализация GINA . Вы можете запускать свои собственные команды в функции WlxIsLogoffOk , которая вызывается, когда пользователь инициирует выход из системы
После создания правильной dll GINA вы можете зарегистрировать ее здесь: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL
Вот реализация, которая может соответствовать вашим потребностям (она предоставляет ключ реестра для выхода из системы, в котором вы можете указать свою команду): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html
Если вам нужно что-то простое и работающее для одного (или любого) пользователя, вы можете создать простое приложение, например, на C ++ или C #.
Самым простым является наличие C # в лотке ( просто добавив компонент лотка в форму), а также регистрацию и обработчик событий для события FormClosing . Это будет выглядеть так:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason != CloseReason.UserClosing)
{
// It's not the user closing the application,
// Let's do whatever you want here, for example starting a process
Process notePad = new Process();
notePad.StartInfo.FileName = "notepad.exe";
notePad.StartInfo.Arguments = "ProcessStart.cs";
notePad.Start();
}
}
Итак, ваше приложение будет запускаться с Windows или с пользователем. Он будет ждать (используя немного памяти) и будет что-то делать при выключении системы или выходе пользователя из системы и т. Д. (Путем проверки «CloseReason» выше).
Если вы хотите, чтобы запущенная программа выполняла код при выходе из системы, вы должны перехватить сообщение WM_QUERYENDSESSION
и найти значение lParam
, равное ] ENDSESSION_LOGOFF
(0x80000000).
Важно проверить это значение lParam
, потому что другие указывают на «принудительное закрытие» - то есть ваш процесс может быть остановлен до того, как ваш код получит разрешение запустить. Фактически, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и они не так безопасны для ответа с помощью длительных действий; но эта конкретная комбинация должна подойти.
Примечание: я никогда не пробовал запускать отдельный процесс в ответ на сообщение WM_QUERYENDSESSION
. Это' Возможно, оконный менеджер запретит это, как это происходит при выключении. Я думаю, попробуйте и убедитесь.
Если вы работаете в среде .NET (вы не указали), более быстрый способ - добавить обработчик событий в Microsoft.Win32.SystemEvents.SessionEnding
событие.
Как уже упоминали VonC и TFD, редактор групповой политики - это просто еще один способ управления реестром.
Просто внесите с помощью gpedit изменения (в Userconfig - Настройки Windows - Скрипты), которые вам нравятся. а затем загляните в реестр по адресу [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts]
чтобы узнать, как это сделать напрямую.
Также на моем ПК (висит в домене) есть скрытая папка C: \ WINDOWS \ System32 \ GroupPolicy
с подпапками для пользователя и машины. У обоих есть дополнительные подпапки, называемые Shutdown и Startup. Может, тебе тоже пригодятся эти.