Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Массив, числа 
:(
    Опции темы
nightlife
Дата 16.1.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



 Определить колво всех 7мизначн чисел,сумма цифр которого равна 60. Поместить эти числа в массив в порядке убываниЯ
PM MAIL   Вверх
Sanaff
Дата 16.1.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 15.9.2009
Где: г. Северодвинск

Репутация: -1
Всего: 1



Могу сделать задачку, обращайтесь на почту [email protected] или  ICQ 373-628-456

--------------------
Программист - это локальный бог ©ICQ 373-628-456
PM MAIL WWW ICQ   Вверх
ClrScr
Дата 31.1.2010, 16:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.1.2010

Репутация: нет
Всего: нет



Код

uses crt;
var a:array[1..1000] of integer;
    s:string;
    i,x,k,f,sum,n:integer;
begin
k:=1;
for f:=9999999 downto 1000000 do
begin
sum:=0;
str(f,s);
for i:=1 to length(s) do
begin
case ord(s[i]) of
48: x:=0;
49: x:=1;
50: x:=2;
51: x:=3;
52: x:=4;
53: x:=5;
54: x:=6;
55: x:=7;
56: x:=8;
57: x:=9;
end;
sum:=sum+x;
end;
if sum=60
then
begin
a[k]:=f;
inc(k);
inc(n);
end;
end;
for i:=1 to n do
write(a[i],' ');
end.

PM MAIL   Вверх
t_gran
Дата 1.2.2010, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



ClrScr, Вы бы ещё в одну строчку написали! Учитесь форматировать код прежде чем помогать.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
ClrScr
Дата 4.2.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.1.2010

Репутация: нет
Всего: нет



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

P.S. Кстати, программа у всех корректно работает???
PM MAIL   Вверх
volvo877
Дата 5.2.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(ClrScr @  4.2.2010,  21:01 Найти цитируемый пост)
Кстати, программа у всех корректно работает??? 
Нет, конечно... Это и без компиляции видно. Диапазон допустимых значений для типа Integer - от -32768 до +32767 (в Турбо-Паскале, к примеру), а ты миллионами ворочаешь. Хотя да, 
Цитата(ClrScr @  4.2.2010,  21:01 Найти цитируемый пост)
в таких маленьких и простых программах больше важен результат
, фиг бы с ним, что неправильный, кого это вообще интересует?

К тому же, ко тебе дал право увеличивать значение n? Ты его инициализировал, чтоб с им работать? На предупреждения компилятора - тоже не смотрим? Надеемся на то, что автоматически туда занесется 0? Напрасно. Гораздо спокойнее проинициализировать самому, и не волноваться потом...


PM MAIL   Вверх
ФедосеевПавел
Дата 5.2.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Можно, и я парочку вариантов подкину?
Первый, компилируется и в TP и в FPC
Код

PROGRAM Pas_022a;
CONST
  N     = 7;    {количество разрядов в проверяемом числе}
  EtSum = 60;   {эталонная сумма цифр}
TYPE
  {тип для определения числа. Один элемент массива - одна цифра числа.
   Элемент с индексом [1] - младший, с индексом [N] - старший.}
  TArray = array [1..N] of Integer;

{инкремент числа типа TArray}
PROCEDURE IncTArray(VAR x : TArray);
VAR
  i   : Integer;
  CY  : Integer;  {признак переноса в старший разряд}
BEGIN
  CY:=1;
  for i:=1 to N do begin
    x[i]:=x[i]+CY;
    if x[i]>9
      then x[i]:=x[i]-10
      else CY:=0;
    if CY=0 then Break;
  end;
END;

{вывод на экран числа типа TArray}
PROCEDURE ShowTArray(VAR x : TArray);
VAR
  i   : Integer;
BEGIN
  for i:=N downto 1 do
    if x[i]<>0
      then Write(x[i])
      else Write(' ');
  Write(' ');
END;

{вычисление суммы цифр числа типа TArray}
FUNCTION  SumTArray(VAR x : TArray) : Integer;
VAR
  i   : Integer;
  Sum : Integer;  {сумма цифр числа x}
BEGIN
  Sum:=0;
  for i:=1 to N do Sum:=Sum+x[i];
  SumTArray:=Sum;
END;

{проверка на максимально возможное значение числа типа TArray}
FUNCTION  IsMaxTArray(VAR x : TArray) : BOOLEAN;
BEGIN
  IsMaxTArray:=(SumTArray(x)=9*N);
END;

VAR
  x     : TArray;   {одно из искомых чисел}
  Count : Integer;  {количество чисел, удовлетворяющих условию Sum(x[i])=EtSum}
  i   : Integer;
BEGIN

  Count:=0;

         {7654321}  {7654321}
  {for x:=1000000 to 9999999 do}
  {x:=1000000}
  x[N]:=1;
  for i:=(N-1) downto 1 do x[i]:=0;

  repeat
    if SumTArray(x)=EtSum
    then begin
      Inc(Count);
      ShowTArray(x);
    end;
    if IsMaxTArray(x) then Break;
    IncTArray(x);
  until FALSE;
  WriteLn;
  WriteLn(Count);
END.

Второй, компилируется только в TP, а FPC сильно не согласен с таким подходом 
Код

PROGRAM Pas_022b;
CONST
  N     = 7;    {количество разрядов в проверяемом числе}
  EtSum = 60;   {эталонная сумма цифр}
TYPE
  {тип для определения числа. Один элемент массива - одна цифра числа.
   Элемент с индексом [1] - младший, с индексом [N] - старший.}
  TArray = array [1..N] of Integer;

{вывод на экран числа типа TArray}
PROCEDURE ShowTArray(VAR x : TArray);
VAR
  i   : Integer;
BEGIN
  for i:=N downto 1 do
    if x[i]<>0
      then Write(x[i])
      else Write(' ');
  Write(' ');
END;

VAR
  x     : TArray;   {одно из искомых чисел}
  Sum   : Integer;  {сумма цифр числа x}
  Count : Integer;  {количество чисел, удовлетворяющих условию Sum(x[i])=EtSum}
  i     : Integer;
BEGIN

  Count:=0;
  for x[7]:=1 to 9 do begin
    for x[6]:=0 to 9 do begin
      for x[5]:=0 to 9 do begin
        for x[4]:=0 to 9 do begin
          for x[3]:=0 to 9 do begin
            for x[2]:=0 to 9 do begin
              for x[1]:=0 to 9 do begin
                Sum:=0;
                for i:=1 to N do Sum:=Sum+x[i];
                if Sum=EtSum
                then begin
                  Inc(Count);
                  ShowTArray(x);
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
  WriteLn;
  WriteLn(Count);
END.


Это сообщение отредактировал(а) ФедосеевПавел - 5.2.2010, 17:54
PM   Вверх
volvo877
Дата 6.2.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(ФедосеевПавел @  5.2.2010,  16:44 Найти цитируемый пост)
Второй, компилируется только в TP, а FPC сильно не согласен с таким подходом 
Во-первых, его можно попросить согласиться ({$mode TP}, хотя делать этого действительно не стОит, тут FPC полностью прав, а Борланд не выполняет того ,что написано в его же документации:
Цитата
В качестве управляющей переменной должен использоваться идентификатор переменой (без какого-либо  квалификатора), который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for.
, Отсюда)

А во-вторых, вот это:
Код
var
  k, curr, value: longint;
  sums: array[1 .. 7] of integer;
  i1, i2, i3, i4, i5, i6, i7: integer;

begin
  k := 0;
  for i1 := 9 downto 1 do begin
    sums[1] := i1;
    for i2 := 9 downto 0 do begin
      sums[2] := sums[1] + i2;
      for i3 := 9 downto 0 do begin
        sums[3] := sums[2] + i3;
        for i4 := 9 downto 0 do begin
          sums[4] := sums[3] + i4;
          for i5 := 9 downto 0 do begin
            sums[5] := sums[4] + i5;
            for i6 := 9 downto 0 do begin
              sums[6] := sums[5] + i6;
              for i7 := 9 downto 0 do begin
                sums[7] := sums[6] + i7;
                if sums[7] = 60 then begin
                  inc(k);
                  write(i1, i2, i3, i4, i5, i6, i7, ' ');
                end;
              end
            end
          end
        end
      end
    end
  end;
  writeln(k);
end.
у меня работает в среднем в 3 раза быстрее, чем твой код (FPC 2.4)


Это сообщение отредактировал(а) volvo877 - 6.2.2010, 17:56
PM MAIL   Вверх
ФедосеевПавел
Дата 8.2.2010, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Ой, точно...
Цитата(nightlife @  16.1.2010,  15:42 Найти цитируемый пост)
Поместить эти числа в массив в порядке убываниЯ


Надо же. Сокращение вычисления суммы цифр как значительно влияет на скорость (второй выриант с mode TP, конечно, не в три раза, но всё равно заметно медленнее).

Спасибо! ;)

Ещё раз посмотрел. Именно второй вариант раза в три медленнее, а про первый лучше совсем забуду.

Спасибо! Красивая идея!

Это сообщение отредактировал(а) ФедосеевПавел - 8.2.2010, 01:13
PM   Вверх
doda
Дата 9.3.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.3.2010

Репутация: нет
Всего: нет



ввести с клавиатуры предложение из нескольких слов. упорядочить буквы в каждом слове методом "просеивания" по алфавиту
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.