• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Задача С Массивами:)

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

Ruslan737

Умоляю,помогите решить задачу пожалуйста,никак не могу сам сделатьа сроки поджимают. C++
Дан массив целых чисел в количестве 16
элементов.
Найти такие элементы (а также их сумму),
которые состоят из двух равных частей и
имеют в своем составе цифру 3.


Пример: 4343 9131 33 3313 646 3223 1313;
результат: 4343+1313=5656.
 
R

rrrFer

число помещаешь в stringstream, читаешь из stringstream строку, и на строке проверяешь наличие цифры 3 и т.п. Если проверки успешны - прибавляешь число к сумме.
 
R

Ruslan737

число помещаешь в stringstream, читаешь из stringstream строку, и на строке проверяешь наличие цифры 3 и т.п. Если проверки успешны - прибавляешь число к сумме.
C++:
#include <stdio.h>
#include <conio.h>
#define N 7
int main()
{
int X[N] = { 4343, 9131, 33, 3313, 646, 3223, 1313 };
int nSum = 0;
for (int m = 0; m < N; m++)
{
int* digits = new int[32];
int q = 0; bool _flag = false;
int n = X[m]; digits[q] = n % 10;
for (q = 1; (n /= 10) > 0; q++)
if ((digits[q] = n % 10) == 3)
_flag = true;
if (_flag != false && (q % 2) == 0)
{
int l = q / 2; bool flag = false;
for (int i = q-1; l > 0 && !flag; i--, l--)
flag = (digits[i] != digits[l-1]) ? 1 : 0;
if (flag != true)
{
printf("%d ",X[m]);
nSum+=X[m];
}
}
}
printf("\nSum = %d\n",nSum);
_getch();
return 0;
}
 
R

rrrFer

Код:
#include <sstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main(){
std ::string str;
std ::vector<int> vect;
std ::stringstream sstr;
int result;

for( int i = 0; i < 10000; i ++ )
vect .push_back( i );

result = 0;
std ::for_each( vect .begin(), vect .end(), [&sstr, &str, &result](int i){
sstr .clear();
sstr << i;
sstr >> str;
int tmp = str .length();
if( str .substr(0, tmp / 2) == str .substr( tmp / 2, tmp ) )
//std ::cout << str << std ::endl;
result += i;
} );

std ::cout << result << std ::endl;

return 0;
}
Я поизвращался чуть чуть )
---
ЗЫ. за критику массово раздаю плюшки )
Ну как бы ясно что лямбда тут или не уместна, или ее как-то не так надо было написать. Кто знает, подскажите, пожалуйста.
 
W

Whatka

r04,интересное решение)

более красиво будет функцию написать
для 3 параметра for_each

std::-7раз написал)) а объявить вначале область имён?)

+я думаю в конце надо удалять массив?
если да,то лучше использовать list у него быстродействие вставки такое же ,а удаление(erase помойму) значительно быстрее
 
R

Ruslan737

Код:
#include <sstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main(){
std ::string str;
std ::vector<int> vect;
std ::stringstream sstr;
int result;

for( int i = 0; i < 10000; i ++ )
vect .push_back( i );

result = 0;
std ::for_each( vect .begin(), vect .end(), [&sstr, &str, &result](int i){
sstr .clear();
sstr << i;
sstr >> str;
int tmp = str .length();
if( str .substr(0, tmp / 2) == str .substr( tmp / 2, tmp ) )
//std ::cout << str << std ::endl;
result += i;
} );

std ::cout << result << std ::endl;

return 0;
}
Я поизвращался чуть чуть )
---
ЗЫ. за критику массово раздаю плюшки )
Ну как бы ясно что лямбда тут или не уместна, или ее как-то не так надо было написать. Кто знает, подскажите, пожалуйста.

Вылетает на Microsoft Visual Studio 2010.В чём может быть проблема?
 
R

rrrFer

std::-7раз написал)) а объявить вначале область имён?)
пространство имен можно подключить, но это не очень хорошо, т.к. тогда могут возникнуть конфликты именования между пользовательским кодом и библиотекой.

+я думаю в конце надо удалять массив?
дак ненадо, тут все автоматически. Я ведь не выделял память через new, значит и освобождать ничего не требуется.

не ври у меня на VS 2010 прекрасно работает
а может и не работать, от версии компилятора зависит. А так как тут всякие штуки из C11 - то компилировать надо с параметром -std=c++11

более красиво будет функцию написать
это да )
 
R

rrrFer

А еще,
+я думаю в конце надо удалять массив?
если да,то лучше использовать list у него быстродействие вставки такое же ,а удаление(erase помойму) значительно быстрее
МБ я ошибаюсь, но vector - это массив, но массив, размер которого изменяется при превышении размера. Т.е. начальный размер, допустим, 10 элементов. При вставке 11-ого элемента, размер, допустим, удвоится, и при добавлении следующих 10 элементов мы получим все преимущества массивов (очень быстро добавление в конец {а в векторе как-то еще и быстрое добавление в начало замутили}). А при вставке этого 11 элемента будет создан новый вектор, все элементы старого будут в него скопированы - и это очень долгая операция, и это портит характеристики операции добавления элемента в худшем случае. Ну а освобождение памяти из пом массива, зато, происходит максимально быстро (об этом мы речь и ведем).

А операция list ::erase выполняется быстрее чем операция удаления элемента из середины вектора, это так. Потому что при удалении из середины массива надо сдвинуть все элементы, стоящие справа от удаляемого влево. При удалении элемента из списка достаточно изменить ссылки правого и левого элементов (4 ссылки всего лишь). Казалось бы, удаление из списка гораздо быстрее, но это так лишь если мы имеем указатель на удаляемый элемент, но а если мы хотим удалить сотый элемент - то при использовании списка нам надо сначала пройти до сотого указателя (вобщем найти этот самый удаляемый элемент)

А значит, в данном случае, использование вектора правильнее использования списка (ведь удалять элементы из середины не придется)

А МБ я и не прав, поправьте :)
 
W

Whatka

я имел ввиду полное удаление контейнера (не освобождение памяти!)
vect.erase(vect .begin(),vect .end()); работает намного дольше чем, list.erase(list .begin(),list .end());

у list::erase быстродействие О(1) ,а у vect::erase О(n),тем более там 10.000 элементов!!!


Т.е. начальный размер, допустим, 10 элементов. При вставке 11-ого элемента, размер, допустим, удвоится, и при добавлении следующих 10 элементов мы получим все преимущества массивов (очень быстро добавление в конец {а в векторе как-то еще и быстрое добавление в начало замутили}).

немного не так
вектор реализован через массив с динамическим выделением памяти
и если мы добавим к уже имеющимся 10 элементам ещё 1
то он выделит память под 11 элементов и скопирует старый массив в новый(поэтому долго работают операции вставки и удаления в векторе)
и я что-то не слышал про вставку и изъятие элемента из начала у вектора :)

ну дальше я полностью согласен)
 
R

rrrFer

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

и я что-то не слышал про вставку и изъятие элемента из начала у вектора huh.gif
и ты правильно не слышал, я затупил )

я имел ввиду полное удаление контейнера
Я к тому, что для "полного удаления" вектора не оптимально erase использовать, есть vector::clear

удаление элемента из конца вектора выполняется за О(1), зачем удалять методом, предназначенным для удаления из произвольного места контейнера если все равно собираешься удалять все элементы?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!