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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2016, 20:53   #1
jeppa
Новичок
Джуниор
 
Регистрация: 05.10.2016
Сообщений: 1
По умолчанию Помогите исправить ошибку: вывести все "недопалиндромы" из указанного диапазона (от a до b). "недопалиндром" - число которое само не является палиндромов,но сумма его цифр является

Задача такая - вывести все "недопалиндромы" из указанного диапазона (от a до b). "недопалиндром" - число которое само не является палиндромов, но сумма его цифр является им. Например, при диапазоне [820;840] "недопалиндромами" являются числа 821 и 830. (Небольшая справка: цифры не являются "недопалиндромами", т.к. в длину 1 символ, поэтому читаются справа на лева и наоборот как бы одинаково).
(об ошибке после кода)
Код:
var s,news:string; a,b,i,k:integer; p:array[0..32767] of integer; fin,fout:text;
begin
assign(fin,'input.txt');
assign(fout,'output.txt');
k:=0;
reset(fin);
read(fin,a,b);
close(fin);
for i:=a to b do
begin
s:=inttostr(i);
news:=inttostr(strtoint(s[1])+strtoint(s[2])+strtoint(s[3])+strtoint(s[4])+strtoint(s[5]));
if (news[1]=news[2]) or (news[2]='') then
begin
if (i>9) and (i<100) then
if s[1]<>s[2] then
 begin
 k:=k+1;
 p[k]:=strtoint(s);
 end;
if (i>100) and (i<1000)then
if s[1]<>s[3] then
 begin
 k:=k+1;
 p[k]:=strtoint(s);
 end;
if (i>1000) and (i<10000)then
if (s[1]<>s[4]) xor (s[2]<>s[3]) then
 begin
 k:=k+1;
 p[k]:=strtoint(s);
 end;
if (i>10000) and (i<32768) then
if (s[1]<>s[5]) xor (s[2]<>s[4]) then
 begin
 k:=k+1;
 p[k]:=strtoint(s);
 end;
end;
end;
rewrite(fout);
write(p);
close(fout);
end.
В 12й строчке (она самая длинная) выдает: Ошибка времени выполнения: Индекс находился вне границ массива.
Помогите разобраться, что не так. Будет хорошо, если вы еще и укажите что именно переделать.

Последний раз редактировалось Аватар; 05.10.2016 в 21:26.
jeppa вне форума Ответить с цитированием
Старый 06.10.2016, 09:06   #2
CMY_3
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 38
По умолчанию

Цитата:
Сообщение от jeppa Посмотреть сообщение
Помогите разобраться, что не так. Будет хорошо, если вы еще и укажите что именно переделать.
пустите переночевать, а то так есть хочется... (с)

На мой взгляд, решать такие задачи через строки, плюс ещё и с массивом не очень хороший подход.
CMY_3 вне форума Ответить с цитированием
Старый 06.10.2016, 09:13   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
news:=inttostr(strtoint(s[1])+strtoint(s[2])+strtoint(s[3])+strtoint(s[4])+strtoint(s[5]));
А вы уверены что в записи числа i {s:=inttostr(i);} будет ПЯТЬ цифр (т.е. i>9999)
потому что, если их будет меньше, то s[5] НЕ существует, и вы получаете то, что вы и получили
Цитата:
Индекс находился вне границ массива.
Цитата:
Например, при диапазоне [820;840]
вот числа из ЭТОГО диапазона уж точно не имеют ПЯТИ цифр.

Код:
r:=0;
for j:=1 to length(s) do r:=r+strtint(s[j]);
news:=inttostr(r);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.10.2016 в 09:19.
evg_m на форуме Ответить с цитированием
Старый 06.10.2016, 09:27   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
  for i:=a to b do begin
    s:=0; x:=i;
    repeat
      s:=s+x mod 10;
      x:=x div 10;
    until x=0;
    c:=0; x:=s;
    repeat
      c:=c*10+x mod 10;
      x:=x div 10;
    until x=0;
    if (s>9) and (s=c) then --> i недопалиндром;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.10.2016, 09:50   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Аватар, отлично!
есть пара замечаний.

первое.
нет проверки на то, что число i не является палиндромом (очевидно, что if (s>9) эту задачу не решает и вообще не нужно ).

второе. если это олимпиадная задача, то нужно посмотреть на возможные диапазоны входных значений, есть подозрение, что могли подбросить "подлянку" в в виде отрицательных значений.

p.s. исходный вариант - это, конечно, "жесть"!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.10.2016, 10:20   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А зачем i проверять на палиндромность? Это не важно. А вот и примерчик - 11111111111 одновременно и палиндром и недопалиндром. Для другого диапазона конечно, чем у ТС. А s>9 исключает те, сумма цифр которых однозначное число. Иначе 23 тоже недопалиндром, поскольку 5 туда и сюда одинаково читается. Оптимальней конечно проверку перед вторым вложенным циклом поставить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.10.2016 в 10:24.
Аватар вне форума Ответить с цитированием
Старый 06.10.2016, 10:26   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
А зачем i проверять на палиндромность?
ну так условие же такое:
Цитата:
. "недопалиндром" - число, которое само не является палиндромом, но сумма его цифр является им.
Подумайте, ведь не может же палиндром являться недопалиндромом.

Цитата:
Иначе 23 тоже недопалиндром, поскольку 5 туда и сюда одинаково читается.
да, 23 - это недопалиндром, Вы правы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.10.2016, 10:29   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Да, условие не доглядел. Ну и фиг с ним, пусть ТС делает предварительную проверку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.10.2016, 10:57   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Ну и фиг с ним, пусть ТС делает предварительную проверку
категорически согласен.
простой, понятный и рабочий код Вы ему дали.
Этого вполне достаточно, чтобы разобрать решение и дописать проверку на то, что i не является палиндромом (кстати, это удобно делать прямо в том же цикле, где идёт подсчёт суммы цифр исходного числа).
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметическая задача(Delphi(в форме)).Найти все трехзначные числа,сумма цифр которых равна А,а само А делится на В.А и В вводятся NIR957 Помощь студентам 1 16.10.2013 23:02
Определить, сумма цифр является четным или нечетным числом. harvey Помощь студентам 1 10.10.2012 21:38
Как из диапазона вывести число, которое первое удовлетворит одному из условий fury1986 Microsoft Office Excel 1 12.08.2012 10:11
Натуральное число, в записи которого п цифр, называется числом Армстронга, если сумма его цифр, возведенн OTLi4HO Общие вопросы C/C++ 6 14.01.2009 19:48