Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2015, 20:52   #1
aliya28
 
Регистрация: 29.01.2015
Сообщений: 3
По умолчанию Трехзначные числа Каприкара. Помогите найти ошибку в коде

Здравствуйте! Написала код программы и в результате она не должна выводить трехзначные числа типа 101 111 232(чтобы первая и последняя не были одинаковыми), но у меня выводит. Подскажите что не правильно или может надо дописать условие?
Код
Код:
program a1;

var 
   i: integer;
   b,x1,x2,x3,i2,razn2:integer;
  
function oborot2 (b: integer):integer;
var
  x1,x2,x3: integer;
begin
      x1 := b div 100;
      x2 := (b-x1*100) div 10;
      x3 := b mod 10;
      oborot2:= x3*100+x2*10+x1;
end;   
begin
   writeln('Трехзначные числа Каприкара: ');
   for i:=100 to 999 do
   begin
      b:=i;
      x1 := b div 10;
      x2 := (b-x1*100) div 10;
      x3 := b mod 10;
 if (x1<>x3) and (x1<>x2) then
      begin
        i2:= x3*100+x2*10+x1;
        razn2:=b-i2;
        while abs(razn2)<>99 do
        begin
          razn2 := razn2 - oborot2(razn2); 
        end;
        write(i,' ');
      end;
   end;  
   writeln;  
end.

Последний раз редактировалось Stilet; 05.02.2015 в 08:06.
aliya28 вне форума Ответить с цитированием
Старый 04.02.2015, 21:14   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

А напиши изначальные условия задачи. Непонятно что вычисляют х
для i=101
x1=10
x2=(101-100*10)/10=-89
x3=101 mod 10=10
Что это?
FPaul вне форума Ответить с цитированием
Старый 04.02.2015, 21:22   #3
aliya28
 
Регистрация: 29.01.2015
Сообщений: 3
По умолчанию

алгоритм задачи следующий:
берется число из него вычитается его зеркалка полученное число сравниваем с |9|,если да выводим первоначальное число, если нет идет цикл.
А то что вы спросили это этап "переворачивания" числа
aliya28 вне форума Ответить с цитированием
Старый 04.02.2015, 21:58   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ух как понятно "зеркалка", "сравниваем с |9|"
Судя по "Трехзначные числа Каприкара:" можно обратится к Wikipedia. Так там описывается что-то отдалённо похожее на "зеркалка".
Уточни исходный текст задания.

PS х1...х3 это разряды. Их нужно иначе извлекать
Код:
  x1:=b mod 10;
  b:=b div 10;
  x2:=b mod 10;
  b:=b div 10;
  x3:=b mod 10;
А по-хорошему, раз потребуется сортировка, то лучше в массив
Код:
var
  x: array[0..2] of integer;
begin
.........
  b:=i;
  for j:=0 to 2 do
  begin
    x[j]:=b mod 10;
    b:=b div 10;
  end;
FPaul вне форума Ответить с цитированием
Старый 04.02.2015, 22:08   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

1. Следует изменить условие:
Код:
if (x1<>x3) and (x1<>x2) then ...
2. Завели функцию, но не используете по полной ...
Код:
...
for i:=100 to 999 do
begin
b:=i;
x1 := b div 10;
x2 := (b-x1*100) div 10;
x3 := b mod 10;
if (x1<>x3) and (x1<>x2) then
...
Код:
var
   i: integer;
   b,x1,x2,x3,i2,razn2:integer;

function oborot(b: integer):integer;
var
x1, x2, x3: integer;
begin
   x1 := b div 100;
   x2 := (b - x1 * 100) div 10;
   x3 := b mod 10;
   oborot := x3 * 100 + x2 * 10 + x1;
end;

begin
writeln('Трехзначные числа Каприкара: ');
for i:=100 to 999 do
begin
   if (abs(i - oborot(i)) <> 0) then
   begin
      i2 := abs(i - oborot(i));
      while (i2<>99) do
      begin
         i2 := abs(i2 - oborot(i2));
         if i2 < 99 then break;
      end;
      write(i,' ');
   end;
end;
writeln;
end.

Как-то так, ...
PS: На реальной программе не проверял ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 04.02.2015, 23:00   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

ViktorR, мне видется, что ТС невнятно сформулировал постановку задачи. В теле программы присутсвует упоминание константы Капрекара, а по факту вычисляется что-то другое. Отсюда вывод, что ему ни посоветовать - все "мимо кассы".
А "оборот" я бы сделал так
Код:
  function Reverse(a, n: integer): integer;
  var
    i: integer;
    r: integer;
  begin
    r := 0;
    for i := 0 to n - 1 do
    begin
      r := r * 10 + (a mod 10);
      a := a div 10;
    end;
    Reverse := r;
  end;
FPaul вне форума Ответить с цитированием
Старый 05.02.2015, 21:01   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Можно и так. Не задумывался.
Но тогда уж лучше так:
Код:
function Reverse(a : longint) : longint;
var m, n : longint;
begin
   m := 0;
   n := a;
   repeat
      m := m * 10 + (n MOD 10);
      n := n DIV 10;
   until n <= 0;
   Reverse := m;
end;
Как мне кажется, что не всякий компилятор пережует:
Код:
 function Reverse(a, n: integer): integer;
  var
    i: integer;
    r: integer;
  begin
    r := 0;
    for i := 0 to n - 1 do
    begin
      r := r * 10 + (a mod 10);
      a := a div 10; {a - определена как параметр по значению}
    end;
    Reverse := r;
  end;

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.02.2015, 21:08   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А почему компилятор не пережует
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.02.2015, 22:01   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Во первых: мне кажется, что не всякий компилятор пережует

Там по тексту кода.
a - параметр, который передается по значению.
В стеке есть место, которое занимает этот параметр и компилятор мог бы принять выражение, например такого типа
Код:
a := 10;
Насколько я помню, TP7 на подобное использование параметра, который передается по значению, ругался.


Как-то так, ...

PS: У меня FPC. Попробовал, компилируется нормально.
Как-то так, ...

Последний раз редактировалось ViktorR; 05.02.2015 в 22:14.
ViktorR вне форума Ответить с цитированием
Старый 05.02.2015, 22:07   #10
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

ViktorR,
a - параметр-значение, внутри процедуры эквивалентен тем локальным переменным, что в блоке var (в своё время для турбопаскаля я много делал процедур на асме и "видел" что там происходило).
Такая функция с размерностью n - потому, что для вычисления числа Капрекара удобен именно такой вариант. Я так думал вначале.
Число Капрекара получается через несколько итераций следующего вида:
1. Берём трёхзначное число (можно и больше, но у ТС именно трёхзначное).
2. Располагаем цифры в порядке уменьшения (пусть будет переменная A).
3. Располагаем цифры в порядке увеличения (пусть будет переменная В).
4. из А вычитаем В.
5. С полученным новым числом к п.1, только если это число другое.
Код:
// Kaprekar's constant
program KaprekarsConstant;

  procedure sort(var a: array of integer; n: integer);
  var
    i, j: integer;
    t: integer;
  begin
    for i := 0 to n - 1 do
    begin
      for j := i + 1 to n - 1 do
      begin
        if a[i] > a[j] then
        begin
          t := a[i];
          a[i] := a[j];
          a[j] := t;
        end;
      end;
    end;
  end;

  function KaprekarStep(a, n: integer): integer;
  var
    x: array[0..2] of integer;
    i: integer;
    b: integer;
  begin
    for i:=0 to n-1 do
    begin
      x[i] := a mod 10;
      a := a div 10;
    end;
    sort(x, n);
    a := 0;
    b:=0;
    for i := n - 1 downto 0 do
      a := a * 10 + x[i];
    for i := 0 to n - 1 do
      b := b * 10 + x[i];
    KaprekarStep := a - b;
  end;

var
  x1, x2: integer;
begin
  x1 := 104;
  repeat
    x2 := x1;
    x1 := KaprekarStep(x1,3);
  until x1 = x2;
  writeln(x1);
end.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти все трехзначные числа, квадраты которых оканчиватюся тремя цифрами, которые и составляют искомые числа (на ABC pascal) Роял Паскаль, Turbo Pascal, PascalABC.NET 4 29.01.2015 21:09
Помогите найти ошибку в коде! Igrohim Общие вопросы Delphi 10 29.12.2014 00:01
Пять задач (Найти все трехзначные числа,Массивы и Найти самое длинное симметричное слово)VBA Nod123 Помощь студентам 0 24.12.2014 01:30
Помогите найти ошибку в коде vbn1 Общие вопросы C/C++ 4 12.12.2014 20:50
Помогите найти ошибку в коде. Kapustachkin Общие вопросы C/C++ 9 05.11.2014 10:38