Язык программирования Перфолента.Net - Официальный сайт

 Язык программирования Перфолента.Net - Официальный сайт.

Поиск   
Главная :: О проекте :: Контакты :: Обратная связь :: Благодарности :: ВходГость

   >   >   > 


Пример «Вычисление Пи методом 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

Перейти в раздел:
Примеры
  Поддержи проект!

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

  Новости:
      21.01.2026 На сайт добавлена статья "Конструируем класс. События"
      20.01.2026 Опубликован новый релиз 0.4.18.0_NY языка программирования Перфолента.Net
      29.12.2025 Анонс: Новая возможность - разрабатываем веб-сайты, веб-приложения и веб-API на Перфоленте!
      07.06.2025 Небольшие дополнения к документации на сайте - описание атрибута поля &Атомарное
      09.05.2025 На сайте опубликован релиз 0.4.16.0_SE дистрибутива языка программирования Перфолента.Net
      27.04.2025 Дополнена статья про циклы
      04.01.2025 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.15.0_CE
      23.09.2024 Опубликована новая статья: "Конструируем класс. Делегаты."
      30.08.2024 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.14.0
      24.05.2024 Обновлён справочный раздел сайта
      01.07.2023 Новая версия 0.4.13.0 языка программирования Перфолента.Net
       Все новости