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

Тема в разделе "C/C++/C#", создана пользователем Ruslan737, 14 июн 2012.

  1. Ruslan737

    Ruslan737 New Member

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


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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    число помещаешь в stringstream, читаешь из stringstream строку, и на строке проверяешь наличие цифры 3 и т.п. Если проверки успешны - прибавляешь число к сумме.
     
  3. Ruslan737

    Ruslan737 New Member

    Регистрация:
    4 апр 2012
    Сообщения:
    4
    Симпатии:
    0
    Код (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;
    }
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
    #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;
    }
    Я поизвращался чуть чуть )
    ---
    ЗЫ. за критику массово раздаю плюшки )
    Ну как бы ясно что лямбда тут или не уместна, или ее как-то не так надо было написать. Кто знает, подскажите, пожалуйста.
     
  5. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    r04,интересное решение)

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

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

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

    Ruslan737 New Member

    Регистрация:
    4 апр 2012
    Сообщения:
    4
    Симпатии:
    0
    Вылетает на Microsoft Visual Studio 2010.В чём может быть проблема?
     
  7. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    не ври у меня на VS 2010 прекрасно работает


    что именно тебе пишет?
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    пространство имен можно подключить, но это не очень хорошо, т.к. тогда могут возникнуть конфликты именования между пользовательским кодом и библиотекой.

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

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

    это да )
     
  9. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

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

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

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

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    я имел ввиду полное удаление контейнера (не освобождение памяти!)
    vect.erase(vect .begin(),vect .end()); работает намного дольше чем, list.erase(list .begin(),list .end());

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


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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    он не на единицу размер вектора увеличивает, это точно.

    и ты правильно не слышал, я затупил )

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

    удаление элемента из конца вектора выполняется за О(1), зачем удалять методом, предназначенным для удаления из произвольного места контейнера если все равно собираешься удалять все элементы?
     
Загрузка...
Похожие Темы - Задача Массивами
  1. Янчик
    Ответов:
    0
    Просмотров:
    474
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    778
  3. elzim
    Ответов:
    0
    Просмотров:
    929
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.116
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.104

Поделиться этой страницей