Пример «Вычисление Пи методом Spigot от ИИ DeepSeek»
Файлы:
- Простые приложения
- Вычисление Пи методом Spigot от ИИ DeepSeek.пфл
Пример программы на языке программирования Перфолента.Net:
//Эта программа написанна на языке программирования Перфолента.Net.
//Программа демонстрирует алгоритм Spigot для вычисления числа Пи с большим количеством знаков.
//Автор: Рогаткин Сергей Анатольевич, 2026
//Пример написан с помощью ИИ DeepSeek
#ТипСборки КонсольноеПриложение
#ИспользоватьСтандартнуюБиблиотеку
#Перем ОТЛАДКА = Ложь
#Перем ПОКАЗЫВАТЬ_ПРОГРЕСС = Истина
ИмпортИмён Промкод.Перфолента.Консоль
ИмпортИмён System.Threading
Программа ВычислениеЧислаПи
Функция Старт() тип Целое
ВыводПС("Программа для вычисления числа ? (пи) алгоритмом Spigot")
ВыводПС("Максимальное количество цифр: 54900")
Вывод("Введите количество цифр после запятой: ")
Перем введённаяСтрока тип Строка = ""
ВводСтроки введённаяСтрока
Перем количествоЦифр тип Целое
Попытка
количествоЦифр = Целое(введённаяСтрока)
Исключение
ВыводПС("Ошибка: введите целое число!")
Пауза
Возврат 1
КонецПопытки
// Проверка диапазона
Если количествоЦифр < 1 Тогда
ВыводПС("Ошибка: количество цифр должно быть положительным числом!")
Пауза
Возврат 1
ИначеЕсли количествоЦифр > 54900 Тогда
ВыводПС("Ошибка: максимальное количество цифр - 54900!")
Пауза
Возврат 1
КонецЕсли
ВыводПС("Вычисление ? с " + Формат(количествоЦифр, "ЧЦ=10; ЧГ=") + " цифрами после запятой...")
ВыводПС("Это может занять некоторое время...")
// Выделяем память для результата
Перем Результат тип Строка = ""
Перем времяНачала тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах()
// Вычисляем ?
Перем успешно тип Булево = ВычислитьПи(Результат, количествоЦифр)
Перем времяВычисления тип Число = (ТекущаяУниверсальнаяДатаВМиллисекундах() - времяНачала)/1000
Если успешно Тогда
ВыводПС("")
ВыводПС("Вычисление завершено за " + Формат(времяВычисления, "ЧДЦ=3") + " секунд")
// Показываем результат
Перем количествоПоказать тип Целое = ?(количествоЦифр < 100, количествоЦифр, 100)
ВыводПС("")
ВыводПС("Результат (первые " + количествоПоказать + " цифр):")
ВыводПС("? = " + Лев(Результат, количествоПоказать + 2))
// Записываем в файл
ЗаписатьПиВФайл(Результат, количествоЦифр, времяВычисления)
ВыводПС("")
ВыводПС("Полный результат записан в файл pi_result.txt")
Иначе
ВыводПС("Ошибка при вычислении ?")
КонецЕсли
ВыводПС("")
Вывод("Нажмите Enter для выхода...")
ВводСтроки введённаяСтрока
Возврат 0
КонецФункции
Функция ВычислитьПи(Ссыл результатПи тип Строка, количествоЦифр тип Целое) тип Булево
ПТ = Новый ПостроительТекста
Перем Д,Е,Ж тип Цел64 = 0
Перем Б,Р тип Целое = 0
Перем Ф тип Целое = 10000
Перем Кво тип Целое = (количествоЦифр / 4ч + 1) * 14
// Создаем и инициализируем массив
Массив А[Кво-1] тип Цел64 = 20000000
Перем итерация тип Целое = 0
Перем всего_итераций тип Целое = Кво / 14
#Если ПОКАЗЫВАТЬ_ПРОГРЕСС = Истина Тогда
Вывод("Прогресс: 0%")
#КонецЕсли
// Главный цикл алгоритма Spigot
Цикл
Кво -= 14
Б = Кво
Прервать Если Б <= 0
Д %= Ф
Е = Д
// Внутренний цикл
Пока --Б > 0 Цикл
Д = Д * Б + А[Б]
Ж = (Б << 1) - 1
А[Б] = (Д % Ж) * Ф
Д /= Ж
КонецЦикла
Р = Целое(Е + Д / Ф)
// Форматируем до 4-х цифр
Если Р < 10 Тогда
ПТ.Добавить("000")
ИначеЕсли Р < 100 Тогда
ПТ.Добавить("00")
ИначеЕсли Р < 1000 Тогда
ПТ.Добавить("0")
КонецЕсли
ПТ.Добавить(Строка(Р))
итерация++
#Если ПОКАЗЫВАТЬ_ПРОГРЕСС = Истина Тогда
// Показываем прогресс каждые 10% или каждую итерацию при малом количестве
Если всего_итераций <= 10 Или итерация % (всего_итераций / 10) = 0 Тогда
Перем процент тип Целое = Целое(итерация / Число(всего_итераций) * 100)
Вывод(Символы.ВозвратКаретки + "Прогресс: " + процент + "%")
КонецЕсли
#КонецЕсли
КонецЦикла
#Если ПОКАЗЫВАТЬ_ПРОГРЕСС = Истина Тогда
ВыводПС(Символы.ВозвратКаретки + "Прогресс: 100% - завершено")
#КонецЕсли
// Вставляем точку после первой цифры "3"
ПТ.Вставить(1, ".")
// Обрезаем до нужной длины
результатПи = Лев(ПТ.ВСтроку, количествоЦифр + 2)
Возврат Истина
КонецФункции
Процедура ЗаписатьПиВФайл(цифрыПи тип Строка, количествоЦифр тип Целое, времяВычисления тип Число)
Попытка
Перем файл тип ЗаписьТекста = Новый ЗаписьТекста("pi_result.txt")
файл.ЗаписатьСтроку("=" * 60)
файл.ЗаписатьСтроку("ЧИСЛО ? (ПИ)")
файл.ЗаписатьСтроку("=" * 60)
файл.ЗаписатьСтроку("")
файл.ЗаписатьСтроку("Количество цифр после запятой: " + количествоЦифр)
файл.ЗаписатьСтроку("Время вычисления: " + Формат(времяВычисления, "ЧДЦ=3") + " секунд")
файл.ЗаписатьСтроку("Дата вычисления: " + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm:ss'"))
файл.ЗаписатьСтроку("")
файл.ЗаписатьСтроку("-" * 60)
файл.ЗаписатьСтроку("")
// Записываем ? с разбивкой на строки по 50 цифр
Перем часть тип Строка = Сред(цифрыПи, 1, 2) // "3."
Перем позиция тип Целое = 3
Пока позиция <= СтрДлина(цифрыПи) Цикл
Перем длинаБлока тип Целое = Мин(50, СтрДлина(цифрыПи) - позиция + 1)
часть = часть + Сред(цифрыПи, позиция, длинаБлока)
позиция = позиция + длинаБлока
Если позиция <= СтрДлина(цифрыПи) Тогда
файл.ЗаписатьСтроку(часть)
часть = ""
КонецЕсли
КонецЦикла
Если Не ПустаяСтрока(часть) Тогда
файл.ЗаписатьСтроку(часть)
КонецЕсли
файл.ЗаписатьСтроку("")
файл.ЗаписатьСтроку("-" * 60)
файл.ЗаписатьСтроку("")
файл.ЗаписатьСтроку("Алгоритм: Spigot (Spigot algorithm для вычисления ?)")
файл.ЗаписатьСтроку("Язык реализации: Перфолента.Net")
файл.Закрыть()
Исключение Ош
ВыводПС("Ошибка при записи в файл: " + Ош.ОписаниеОшибки())
КонецПопытки
КонецПроцедуры
КонецПрограммы
К началу статьи
Вернуться в раздел:
Примеры по языку Перфолента.Net
Перейти в раздел:
Примеры