Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Обработка последовательности цифр


Автор: Alexkeny 24.12.2006, 21:56
вобщем другу нужно в инсте сделать такую задачку
Задаются произвольные цифры (например 112846775343490)
и нужно чтобы программа отбрасывала повторные цифры и по порядку расставляла эти самы цифры(т.е из 113465589533 в 1345689)
Подскажите пожалуйста чем сможите

Автор: zabivator 24.12.2006, 22:02
Код

#include <stdio.h>

int filter_and_sort( const char* string, char * result )
{
   unsigned int i, k;
   unsigned int result_number[10];
   for ( i = 0; i < 10; ++i )
      result_number[i]=0;
   for ( i = 0; i < strlen(string); ++i )
   {
      if ( ('0' > string[i]) || ( '9' < string[i] ) )
         return -1;
     result_number[i]++;   
   }
   k = 0;
   for ( i = 0; i < 10; ++i )
      if ( result_number[i] > 0 )
          result[k++] = '0' + i;
   result[k]='\0';
   return 0;
}

Автор: KpoHyc 24.12.2006, 22:10
определяем массив в 10ть элементов. - исходный.
берем строку с цифрами - и первый элемент проверяем на присутсвие в исходной строке, если нету - дописываем в нее его.
потом берем исходную строку и проверяем, если первый эл больше втрого, меняем местами, и так до конца строки, цикл повторяем 10ть раз.

ЗЫ А как он учиться будет?)

Автор: zkv 24.12.2006, 22:23
Код

#include <iostream>
#include <set>
using namespace std;

int main(void)
{
    char str[]="1234558547657834634556798477623543765985698553265453646";
    set< char > strSet( str, str + strlen(str) );
    for( set< char >::iterator itStr = strSet.begin(); itStr != strSet.end(); ++itStr )
        cout<<"\n"<<*itStr;
    cin.get();
}

Цитата(KpoHyc @  24.12.2006,  22:10 Найти цитируемый пост)
ЗЫ А как он учиться будет?)

видимо не очень то и надо.

не заметил, что на Си надо, простите...

Автор: comp 24.12.2006, 22:27
Код

void parse(string s)
{
 int mark[10];

 memset(mark, 0, sizeof(mark));
 for (int i =0 ; i < (int)s.length(); i++)
 {
   int id = (char)s[i] - 48;
   if (mark[id]) s.erase(i--, 1);
   mark[id] = 1;
 }
 printf("%s", s.c_str());
}


Ну и STL тут не уместенн... да... с set'ом сложность получается O(N*logN)... а так, просто за один проход всё делается...


M
Alexeis
Модератор: указывайте подсветку кода http://forum.vingrad.ru/index.php?showtopic=126445

Автор: Xenon 24.12.2006, 22:57
А можно тут юзать std::list, ибо есть метод unique() smile

Автор: zkv 24.12.2006, 23:07
Цитата(Xenon @  24.12.2006,  22:57 Найти цитируемый пост)
А можно тут юзать std::list, ибо есть метод unique()

нельзя, и зачем нужен unique() (в этой задаче), если есть std::set? smile

Автор: Alexkeny 24.12.2006, 23:18
задачка то с первого курса тех инста так что особо сложных функций ненадо)
Всем кто ответил Спасибо!!!
а как этот чувачок учится будет хз
учебник Березина и березина видимо потерял)))
Можите тока плиз задачку попроще расписать не влезая в дебри Си, или хотябы блок схемку общую
ПС:KpoHyc(у) спс ;)

Автор: Dov 25.12.2006, 00:34
Цитата(Alexkeny @  24.12.2006,  22:18 Найти цитируемый пост)
Можите тока плиз задачку попроще расписать не влезая в дебри Си

Alexkeny, самая простая, которая пришла мне в голову. 
Код
#include <stdio.h>
#include <stdlib.h>

int cmp(const void* a, const void* b)
{
    return (*(char*)a - *(char*)b);
}

int main()
{
    char str[] = "113465589533";
    char* p    = str;

    qsort(str, strlen(str), sizeof(char), cmp);

    while(*p)
    {
        while(*p && *p == *(p + 1))
            p++;
        putchar(*p++);
    }
    putchar('\n');

    return 0;
}

Автор: Alexkeny 25.12.2006, 07:48
Сори что неправильно сформулировал smile 
Цифры задаете вы сами т.е идет считывание с клавы а не какой то фиксированный ряд чисел

PS:Dov спасибо за помощь(но чуть чуть не то)

Автор: Dov 25.12.2006, 07:59
Код

#include <stdio.h>
#include <stdlib.h>

int cmp(const void* a, const void* b)
{
    return (*(char*)a - *(char*)b);
}

int main()
{
    char str[81];
    char* p    = str;

    puts("Enter string: ");
    scanf("%s", str);

    qsort(str, strlen(str), sizeof(char), cmp);

    while(*p)
    {
        while(*p && *p == *(p + 1))
            p++;
        putchar(*p++);
    }
    putchar('\n');

    return 0;
}

Автор: Alexkeny 25.12.2006, 22:02
->Dov
 Благодарю!!

Автор: sergejzr 23.1.2007, 22:43
Внимание! Эта тема не соответствует правилам форума

Заголовок темы не отражает её суть, или несколько вопросов в одной теме.

Ознакомьтесь с правилами! http://forum.vingrad.ruhttp://forum.vingrad.ru/act-SR/f-27.html[ММ]

Тема перенесена в Центр Помощи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)