Автор Тема: сумма элементов  (Прочитано 4103 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bifshtex

  • Пользователь
  • **
  • Сообщений: 70
    • Просмотр профиля
сумма элементов
« : 17 Февраля 2010, 18:54:16 »
В целочисленном массиве, состоящем из 20 элементов, определить и вывести на экран те элементы, которые можно представить суммой двух других элементов.
Т.е., например, если был изначально такой массив(я возьму 7 элементов):
-1 2 2 4 7 9 13
в итоге должно быть так:
4 9 13

я ее почти решил, вот прога:
uses crt;
const n=20;
type mas=array[1..n] of integer;
var
x:mas;
sum:integer;
i,j,k:byte;
begin
clrscr;
for i:=1 to n do
 readln(x);

for i:=1 to n-1 do
 for j:=i+1 to n do
 begin
 sum:=x+x[j];
 for k:=1 to n do
  if sum=x[k] then write(sum,' ');
 end;
readln
end.

только вот косяк, когда я ввожу такие данные: 2 4 6 7 8 10 11
в результате получается : 6 8 10 10 11
Так вот, как избежать повторения? не используя другой массив???

Оффлайн privatnebank

  • Пользователь
  • **
  • Сообщений: 24
    • Просмотр профиля
Re: сумма элементов
« Ответ #1 : 17 Февраля 2010, 19:44:16 »
/-------------------------/
var
a: array...
x1, x2: Integer; \\x1  и x2 - это переменные
buf: Integer;\\ сюда будем запоминать число
/-------------------------/
  buf:=0;\\ сначала нет чисел
  {Находим все числа, удовлетворяющие условию}
  for i:=3 to 20 do \\для каждого i-того элемента начиная с третьей позиции. С третьей, потому что т.к. число должно представляться суммой двух элементов, стоящих за ним, то минимум таких чисел должно быть 2.
      begin
      for x1:=1 to i-2 do \\для x1 начиная с первого и по 18
            for x2:=x1+1 to i-1 do \\а также для x2 начиная со второго по 19 проверять следующее условие
                 if (a[x1]+a[x2]=a) and (a<>buf) then \\если сумма x1 и x2 равна i-тому элементу и если i-тый элемент не равен числу, которое мы запоминаем
              begin
              buf:=a; \\запоминаем это число
              Write(a,' '); \\и выводим i-тый элемент
              end;
      end;

Попробуй это записать вместо:
for i:=1 to n-1 do
 for j:=i+1 to n do
 begin
 sum:=x+x[j];
 for k:=1 to n do
  if sum=x[k] then write(sum,' ');
 end;
readln
end.

Тогда числа при выводе повторяться не будут. Только объяви переменные в разделе описаний.

Оффлайн bifshtex

  • Пользователь
  • **
  • Сообщений: 70
    • Просмотр профиля
Re: сумма элементов
« Ответ #2 : 17 Февраля 2010, 20:29:38 »
а ты пробовал ее тестировать, а то я  сделал как ты посоветовал, ниче не правильно...

Оффлайн privatnebank

  • Пользователь
  • **
  • Сообщений: 24
    • Просмотр профиля
Re: сумма элементов
« Ответ #3 : 17 Февраля 2010, 21:20:44 »
Для упорядоченного массива все вроде работает. Тестил на массиве из 7 элементов: -1 2 2 4 7 9 13 ----> выдает 4,9,13.
Для массива: 2 4 6 7 8 10 11 ---> 6.8.10.11...
Смотри:
а ты пробовал ее тестировать, а то я  сделал как ты посоветовал, ниче не правильно...

  const
  n=20;
  var
  a: array [1..20] of Integer;
  i,j,buf,x1,x2: Integer;
  begin
  randomize;
  Write('Введите 20 чисел: ');
  for i:=1 to n do ReadLn(a[i]); {Вводим 20 чисел}
 
  WriteLn('Дан массив a[1..20]:'); {Выводим массив}
  Write('a[');
  for i:=1 to 20 do Write(a[i],' ');
  WriteLn(']');
  ReadLn;

  buf:=0;
  {Находим все числа, удовлетворяющие условию}
  for i:=3 to 20 do
      begin
      for x1:=1 to i-2 do
      for x2:=x1+1 to i-1 do
        if (a[x1]+a[x2]=a[i]) and (a[i]<>buf) then
              begin
              buf:=a[i];
      Write(a[i],' ');
              end;
      end;
  ReadLn;
   end.


Оффлайн bifshtex

  • Пользователь
  • **
  • Сообщений: 70
    • Просмотр профиля
Re: сумма элементов
« Ответ #4 : 17 Февраля 2010, 22:59:12 »
Спасибо=)все работает
единственное что, этот алгоритм совершенно не подходит для отрицательных чисел, ведь например -2 и 2 дадут в сумме 0, а он у нас полюбому не будет выводится...
да и другие отрицательные совершенно не выводятся...

Оффлайн privatnebank

  • Пользователь
  • **
  • Сообщений: 24
    • Просмотр профиля
Re: сумма элементов
« Ответ #5 : 17 Февраля 2010, 23:52:02 »
да, действительно.... я как-то об этом не подумал. Постараюсь что-нибудь придумать

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: сумма элементов
« Ответ #6 : 19 Февраля 2010, 01:23:52 »
Не ну для отрицательных это поведение вполне нормально и здесь можно использовать следующее например сумма по модулю, но это неправильно,потому как это искажает результат, а на самом деле при сложении отрицательных чисел мы имеем дело с алгебраической суммой, где знак "-" вполне нормально и потому для отрицательных чисел мы можем получить искомый результат только в случае отриц.+отриц. Так что алгоритм работает правильно при поставленной задаче.Можно ее уточнить так: найти эл-ты массива равные сумме двух других взятых по модулю.           
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

 

Сумма на С++

Автор Иринки

Ответов: 1
Просмотров: 2802
Последний ответ 20 Ноября 2012, 13:47:40
от tig81
Помогите решить задачу в VBA, определить среднее арифметическое элементов

Автор МалаЯ

Ответов: 0
Просмотров: 5726
Последний ответ 12 Декабря 2010, 15:16:31
от МалаЯ
Курсовик Borland C++, матрица, найти количество нулевых элементов

Автор ivanets

Ответов: 0
Просмотров: 6825
Последний ответ 20 Декабря 2010, 00:16:01
от ivanets
С++ и матрица. Для каждого столбца матрицы определить сумму элементов

Автор Sven

Ответов: 2
Просмотров: 8548
Последний ответ 30 Января 2011, 18:29:15
от Данила
Найти сумму элементов главной диагонали матрици

Автор Ekaterina

Ответов: 2
Просмотров: 6583
Последний ответ 06 Февраля 2010, 12:41:05
от InfStudent