Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 25.12.2021
Сообщений: 39

Как можно ускорить программу? Чтобы работало для N до миллиона? Максимум удалось посчитать 23!, потом возникает переполн

09.03.2022, 16:02. Показов 1540. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно ускорить программу? Чтобы работало для N до миллиона? Максимум удалось посчитать 23!, потом возникает переполнение.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function LastDigit(N: integer): integer;
 
var
   p, i, temp: uint64;
begin
   if (N = 0) or (N = 1) then 
      LastDigit := 1
   else begin
       p := 1;
       for i := 2 to N do begin
          temp := i;
          while temp mod 10 = 0 do
             temp := temp div 10;
          p := p * temp;
          while p mod 10 = 0 do
             p := p div 10;
      end;
      LastDigit := p mod 10; 
   end;
end;
 
var
   A: array [1..1000] of uint64; 
   K, i: uint64;         
begin
    ReadLn(K);
    for i := 1 to K do
       ReadLn(A[i]);
    for i := 1 to K do
       WriteLn(LastDigit(A[i]));
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2022, 16:02
Ответы с готовыми решениями:

Как можно упростить условия или как исправить, чтобы работало правильно
Нужно, чтобы после выполнения условия, к i прибавилась единица или вычиталась единица и цикл начался с начала с условия while while (i...

Как и через что делать множественные скрины (для Win 10) чтобы их потом можно было посмотреть в смартфоне?
1) Мне нужна программа которая автоматически будет сохранять и скрины и то чтобы они шли по порядку от первого до последнего. 2) Мне надо...

Как можно это переделать, чтобы нормально работало? (В задании нужно изменять значения x,y произвольно)
Private Sub Stend() Dim x As Single, y As Single, R As Single Dim C As Integer x = InputBox("x=") y = InputBox("y=") R = Sqr(x ^...

14
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
09.03.2022, 16:44
А что вообще делает ваша программа?

B 24! не может влезть в uint64
25852016738884976640000
против
18446744073709551615
0
0 / 0 / 0
Регистрация: 25.12.2021
Сообщений: 39
09.03.2022, 21:45  [ТС]
Требуется написать программу, позволяющую для заданного N находить последнюю отличную от нуля цифру в числе N!
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
10.03.2022, 04:26
В таком случае, зачем вам массив?

Попробуем получить первые 10 факториалов:
1·1=1
1·2=2
2·3=6
6·4=24
24·5=120
120·6=720
720·7=5040
5040·8=40320
40320·9=362880
362880·10=3628800
Жирным я выделил последнюю отличную от нуля цифру.

Вглядитесь внимательно!
Как получается эта цифра?
Ведь очень просто! И от цифр, стоящих не на последнем месте значения факториала и даже множителя она не зависит.
Т.е. можно было легко написать так:
1·1=1
1·2=2
2·3=6
6·4=24
4·5=20
2·6=72
2·7=14
4·8=32
2·9=18
8·1=8

Получается, что даже uint64 — лишнее!
Вполне можно обойтись integer…
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  n,r,d:Integer;
begin
  Read(n);
  r:=1;
  for n:=2 to n do
    begin
      d:=n;while d mod 10=0 do d:=d div 10;
      r:=r*(d mod 10);while r mod 10=0 do r:=r div 10;r:=r mod 10;
    end;
  Write(r);
end.
2
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
10.03.2022, 09:08
JuriiMW,
программа для 19! выдаёт 4
хотя 19! = 121645100408832000

для 17! программа выдаёт 2, хотя 17! = 355687428096000
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
10.03.2022, 10:04
Да уж!
Это я немного поспешил с выводами.
Дело в том, что умножение на 5 немного портит картину.
Если в первом случае „прокатило“ (4!=24 ·5=120), то в следующем вместо положенного 8 остаётся 2·5=10 (14!=87178291200 ·15=1307674368000)…
Можно извернуться, увеличив число хранимых значащих цифр.
К примеру, вот этот код даст правильный результат до n=124:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  n,r,d:Integer;
begin
  Read(n);
  r:=1;
  for n:=2 to n do
    begin
      d:=n;
      while d mod 10=0 do
        d:=d div 10;
      r:=r*(d mod 1000);
      while r mod 10=0 do
        r:=r div 10;
      r:=r mod 1000;
    end;
  Write(r mod 10);
end.
Остаётся узнать у ТС полное точное задание и название IDE, чтобы дальше развивать тему.

Добавлено через 23 минуты
Хотя!
Вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  a : array [0..9] of Integer;
  n, i, d, p : Integer;
begin
  a[0] := 1; for i := 1 to 9 do a[i] := 0;
  Read(n);
  for n := 2 to n do
    begin
      d := n; while d mod 10 = 0 do d := d div 10;
      p := 0; for i := 0 to 9 do begin p := p + a[i] * d; a[i] := p mod 10; p := p div 10; end;
      while a[0] = 0 do begin for i := 1 to 9 do a[i-1] := a[i]; a[9] := 0; end;
    end;
  Write(a[0]);
end.
Не для TP, но выдал правильный результат для 105
1
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
10.03.2022, 16:18
JuriiMW, а этот вариант не устроит?
Найти последнюю ненулевую цифру факториала n

это что-то вроде
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// (c) volvo
var
  n,m : qword;
  i : integer;
begin
  Read(m);// := 10000;
  n := 1;
  for i := 1 to m do
  begin
    n := n * i;
    while n mod 10 = 0 do n := n div 10;
    n := n mod 1000;
    // writeln(i,' ',n)
  end;
  writeln(n mod 10);
end.
1
0 / 0 / 0
Регистрация: 25.12.2021
Сообщений: 39
10.03.2022, 19:42  [ТС]
Ещё в начале должно спрашивать для скольких чисел нужно будет это сделать и потом ввести эти числа

Добавлено через 24 минуты
А если при входе нужно чтобы еще спрашивалось для скольких чисел это сделать и потом ввести их
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
11.03.2022, 04:17
Overlord Cows, а разве какая-то из приведённых программ не ждёт ввода значения?

Добавлено через 7 минут
Согласно задания:
Цитата Сообщение от Overlord Cows Посмотреть сообщение
Требуется написать программу, позволяющую для заданного N находить последнюю отличную от нуля цифру в числе N!
0
0 / 0 / 0
Регистрация: 25.12.2021
Сообщений: 39
11.03.2022, 08:07  [ТС]
Нужно чтобы в первой строке спрашивалось для скольких чисел произвести операцию и потом сами эти числа.
Например в первой строке вводим 3, значит для трёх следующих произвести операцию.
Пример ввода:
3
2
3
5
Пример вывода:
2
6
2
0
11.03.2022, 08:31

Не по теме:

Overlord Cows, вы правила читали?
Вот обновите свои знания: https://www.cyberforum.ru/announcement.php?a=3
Особенно внимательно 4. Порядок создания тем
Это-же касается и Как можно ускорить программу?
… эти „ускорить“ так нервируют!

0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
14.03.2022, 09:34
Цитата Сообщение от Overlord Cows Посмотреть сообщение
Нужно чтобы в первой строке спрашивалось для скольких чисел произвести операцию и потом сами эти числа.
добавь в var ещё одну переменную (например, k) и обернуть всё тело программы в цикл.
потом
Pascal
1
2
3
4
  Read(k);
  for k:=1 to k do begin
     <тут код полностью, начиная с Read(m)>
  end;
1
0 / 0 / 0
Регистрация: 25.12.2021
Сообщений: 39
15.03.2022, 21:15  [ТС]
Так выводит только для последнего
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
15.03.2022, 21:29
Цитата Сообщение от Overlord Cows Посмотреть сообщение
Так
Значит, не так
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
обернуть всё тело программы в цикл
а как-то иначе.
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
16.03.2022, 12:04
Цитата Сообщение от Overlord Cows Посмотреть сообщение
Так выводит только для последнего
покажи код, который у тебя получился.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2022, 12:04
Помогаю со студенческими работами здесь

Как откомпилировать программу в VC+ 2010 чтобы работало на всех других компьютерах
Во-первых в настройках проекта невозможно сменить версию Framework 4.0 на более низкую. Так и должно быть? Без фреймворков вообще нереально...

Написать эту же программу, только с модулем, чтобы потом можно было вызвать процедуру
Public Class Form1 Private Function f(t As Double, h0 As Double, size As Double) As Double Return (h0 - t ^ 2 + 2 *...

Как под эту программу сделать так , чтобы работало дифференцирование и интегрирование многочленов
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class Mnogochlen { int *A, n; public: ...

Как можно ускорить программу?
program task728; var A: array of integer; n, i ,j, min, nmin, temp: integer; begin ...

Как можно ускорить программу?
god,kolvo=int(input()), int(input()) x,y=0,0 for i in range(god, god + kolvo): if (i%4==0 or i%400==0) and i%100!=0: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru