• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

В чём ошибка? Подскажите, пожалуйста

  • Автор темы Автор темы furt123
  • Дата начала Дата начала

furt123

Новые
Регистрация
6 Дек 2013
Сообщения
25
Реакции
0
Баллы
0
В чём ошибка? Подскажите, пожалуйста

задача проста: нужно проверить простое или составное число по теореме Вильсона. до 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.
 
пернёс z в тип Uint64, добился того, что работает до 19. судя по всему проблема в типах. может у вас есть мысли на счёт того как сделать, чтобы хотя бы до 43 работала.
 
пернёс 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.
 
Ну вот так, мало-мало встав на уши, удалось продвинуться до 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 - он и будет искомым ответом.
 
  • Like
Реакции: DiM
интересный методtehno032 , спасибо, Vladimir_S )
 
Назад
Сверху