Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 18.06.2014, 22:02   #1 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question В чём ошибка? Подскажите, пожалуйста

задача проста: нужно проверить простое или составное число по теореме Вильсона. до 13 работает. а потом нет.
Код:
var
  factorial: Uint64;
  n, z, i: integer;

begin
  write('n = '); readln(n);
  writeln('считаем факториал числа n-1');
  factorial := 1;
  for i := 2 to n - 1 do
    factorial := factorial * i;
  writeln('(n-1)! = ', factorial);
  begin
    writeln('проверяем:');
    z := factorial + 1;
    if z mod n = 0 then  writeln('остаток = 0 => n - простое число')
    else
    begin
      writeln('остаток ≠0 => n - составное число');
      
    end;
  end;
end.
furt123 вне форума   Ответить с цитированием

Старый 18.06.2014, 22:02
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пожалуйста, поищите в этих постах решение своей проблемы

Подскажите пожалуйста по Visaton
Подскажите пожалуйста, что это за микросхема?
Подскажите пожалуйста!
Паскаль. Подскажите в чем ошибка ?
Подскажите, пожалуйста, стоит ли...
Подскажите, пожалуйста, что за штучка?

Старый 18.06.2014, 23:02   #2 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

пернёс z в тип Uint64, добился того, что работает до 19. судя по всему проблема в типах. может у вас есть мысли на счёт того как сделать, чтобы хотя бы до 43 работала.
furt123 вне форума   Ответить с цитированием
Старый 19.06.2014, 12:01   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от furt123 Посмотреть сообщение
пернёс z в тип Uint64, добился того, что работает до 19. судя по всему проблема в типах. может у вас есть мысли на счёт того как сделать, чтобы хотя бы до 43 работала.
Простыми средствами - никак. Мне в моем Free Pascal, благодаря использованию типа QWord (максимум - 18446744073709551615), тоже удалось продвинуться только до n=19. Дальше - всё, обруб.
Код:
var
  factorial: QWord;
  n, i: integer;

begin
 Repeat
  write('n (0 to exit) = ');
  readln(n);
  if n>0 then
   begin
    factorial := 1;
    for i := 2 to n - 1 do
     factorial := factorial * i;
    writeln('(n-1)! = ', factorial);
    writeln('testing:');
    if ((factorial+1) mod n)=0 then
     writeln('n is prime')
    else
     writeln('n is composite');
   end;
 Until n=0;
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 19.06.2014, 13:56   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну вот так, мало-мало встав на уши, удалось продвинуться до n=25:
Код:
var
 z,p,m:QWord;
 n,i:integer;

begin
 Repeat
  write('n (0 to exit) = ');
  readln(n);
  if n>0 then
   begin
    z:=1;
    i:=1;
    p:=1;
    repeat
     inc(i);
     z:=z*i;
     if (z mod 10)=0 then
      begin
       z:=z div 10;
       p:=p*10;
      end;
    until i=n-1;
    m:=((z mod n)*p) mod n;
    writeln('testing:');
    if m=n-1 then
     writeln('n is prime')
    else
     writeln('n is composite');
   end;
 Until n=0;
end.
На всякий случай: метод (только что мною изобретенный) основан на двух легко доказуемых положениях:
1. Если P+1 делится нацело без остатка на Q, то остаток от деления P на Q есть Q-1.
2. Пусть a,b,c,d,e - цифры. Пусть исследуемое число заканчивается k нулями, т.е., для примера, при k=4 запись числа имеет вид abcde0000. Оно, естественно, равно abcde*10000. Так вот, остаток от деления нашего числа на n можно вычислить так:
а) определяем остаток от деления abcde на n.
б) этот остаток умножаем на 10^k, т.е. в нашем примере на 10000.
в) находим остаток от деления полученного произведения на n - он и будет искомым ответом.
Vladimir_S вне форума   Ответить с цитированием
Старый 19.06.2014, 22:48   #5 (permalink)
furt123
Member
 
Регистрация: 06.12.2013
Сообщений: 25
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

интересный метод , спасибо, Vladimir_S )
furt123 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 12:04.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.