Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Deniska
4 / 4 / 0
Регистрация: 15.04.2009
Сообщений: 29
#1

Необычный генератор. - C++

15.04.2009, 17:30. Просмотров 775. Ответов 8
Метки нет (Все метки)

Очень срочно для решения одной задачки нужен генератор, который бы генерировал все возможные варианты 16-значимого шестнадцатеричного числа, при условии когда некоторые из них известны (желательно на C/C++).

Например:

Есть число 123?56???0ABCD?F - где должны меняться только те разряды, которые отмечены знаком "?", т.е. начальное значение будет 1230560000ABCD0F, следующее 1230560000ABCD1F, затем 1230560000ABCD2F и так до 123F56FFF0ABCDFF. Причем ни количество неизвестных, ни их местоположение заранее не известно.

Помогите плиз, а то мучаюсь уже с этим 4 дня и все никак не получается. Вначале хотел массивами сделать, после строками, но мои познания C/C++ еще очень далеки от совершенства
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2009, 17:30     Необычный генератор.
Посмотрите здесь:

Необычный алгоритм Евклида C++
генератор чисел C++
Cоздать какой-то необычный класс) C++
C++ Генератор слов
Генератор чисел C++
Генератор паролей C++
C++ Генератор приглашений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
15.04.2009, 18:03     Необычный генератор. #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
#include <algorithm>
#define Count 16
 
 
std::ostream& operator<<(std::ostream& out,const std::vector<char>& forout)
{
    typedef std::vector<char>::const_iterator CI;
    for(CI next=forout.begin();next!=forout.end();++next)
        out<<*next;
    return out;
}
 
std::istream& operator>>(std::istream& in,std::vector<char>& forin)
{
    forin.resize(Count);
    for(int i=0;i<Count;i++)
        in>>forin[i];
    return in;
}
typedef std::vector<char>::iterator Iter;
void generator(Iter start,Iter end,std::vector<char>& vec)
{
    if(start==end)
    {
        std::cout<<vec<<std::endl;
        return;
    }
    while((*start)!='?')
        start++;
    for(int i=0;i<Count;i++)
    {
        *start=char(i+(i>9?87:48));
        generator(start+1,end,vec);
    }
    *start='?';
}
 
int main() 
{
    std::vector<char> test;
    std::cin>>test;
    Iter start=std::find(test.begin(),test.end(),'?');
    if(start!=test.end())
    {
        Iter end=std::find(test.rbegin(),test.rend(),'?').base();
        generator(start,end,test);
    }
    system("pause");
    return 0;
}
Deniska
4 / 4 / 0
Регистрация: 15.04.2009
Сообщений: 29
15.04.2009, 18:25  [ТС]     Необычный генератор. #3
Вот это оперативность ОГРОМНОЕ СПАСИБО все заработало. Вот что значит профессионалы, пара минут и все работает. Еще раз ОГРОМНОЕ СПАСИБО. Жаль что так поздно узнал про этот форум
Deniska
4 / 4 / 0
Регистрация: 15.04.2009
Сообщений: 29
16.04.2009, 21:38  [ТС]     Необычный генератор. #4
В продолжение темы хочу еще раз попросить помочь уважаемую публику Мне то нужно, чтобы полученные 16-символьные значения можно было перевести в два числа, для дальнейшей обработки. Числа эти будут соответственно по 8 символов. Но как работать с векторами я так и не понял Может подскажите как vector<char> перевести в unsigned long, а то у меня все время возникает ошибка преобразования форматов.

P.S. Плз, я очень на вас надеюсь.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
16.04.2009, 22:27     Необычный генератор. #5
Буквы должны быть большими
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <vector>
#include <algorithm>
#define Count 16
 
__int32 one,two;
 
class VecToLong
{
    __int32 summ;
public:
    VecToLong():summ(0)
    {}
    void operator()(const char a)
    {
        summ*=16;
        summ+=(a-(a>57?55:48));
    }
    operator __int32()
    {
        return summ;
    }
};
 
std::ostream& operator<<(std::ostream& out,const std::vector<char>& forout)
{
    typedef std::vector<char>::const_iterator CI;
    for(CI next=forout.begin();next!=forout.end();++next)
        out<<*next;
    return out;
}
 
std::istream& operator>>(std::istream& in,std::vector<char>& forin)
{
    forin.resize(Count);
    for(int i=0;i<Count;i++)
        in>>forin[i];
    return in;
}
typedef std::vector<char>::iterator Iter;
void generator(Iter start,Iter end,std::vector<char>& vec)
{
    if(start==end)
    {
        //std::cout<<vec<<std::endl;
        Iter it=vec.begin();
        one=std::for_each(it,it+8,VecToLong());
        two=std::for_each(it+8,it+16,VecToLong());
        std::cout<<one<<'\t'<<two<<std::endl;
        return;
    }
    while((*start)!='?')
        start++;
    for(int i=0;i<Count;i++)
    {
        *start=char(i+(i>9?55:48));
        generator(start+1,end,vec);
    }
    *start='?';
}
 
int main() 
{
    std::vector<char> test;
    std::cin>>test;
    Iter start=std::find(test.begin(),test.end(),'?');
    if(start!=test.end())
    {
        Iter end=std::find(test.rbegin(),test.rend(),'?').base();
        generator(start,end,test);
    }
    system("pause");
    return 0;
}
Alexiski
Любитель давать советы
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
16.04.2009, 22:29     Необычный генератор. #6
А смысл генерить сначала вектор из символов, а потом конвертировать? Двойная работа..
Deniska
4 / 4 / 0
Регистрация: 15.04.2009
Сообщений: 29
16.04.2009, 22:39  [ТС]     Необычный генератор. #7
Может я не правильно обрисовал задачу, но мне нужно на выходе именно два 8-символьных числа в шестнадцатеричной форме, причем именно те значения, которые генерируются по алгоритму, описанному выше. Если есть другие предложения, буду рад услышать

P.S. Еще раз спасибо Humanitis за ответ. Я на самом деле очень рад как оперативности ответа, так и его качеством, т.к. я из него много чему научился.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
16.04.2009, 22:43     Необычный генератор. #8
ЭЭ,ну так первоначально в условии ничего не было про конвертирование,а только про вывод в шестнадцетиричном представлении.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2009, 22:50     Необычный генератор.
Еще ссылки по теме:

Генератор Фибоначчи C++
C++ Генератор числа от -1 до 1
Генератор на С++ C++
C++ Необычный вывод через цикл
Работа с файлами, необычный вывод из файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deniska
4 / 4 / 0
Регистрация: 15.04.2009
Сообщений: 29
16.04.2009, 22:50  [ТС]     Необычный генератор. #9
Просто я подумал, что как-то так будет быстрее. Ссори если ввел в заблуждение.
А что, можно сделать еще быстрее? Скорость конечно очень важна, но оптимизацию я думал оставить на последок.

P.S. Короче я как последний наглец прошу подсказать вариант, в котором эта прога будет работать "мгновенно"
Yandex
Объявления
16.04.2009, 22:50     Необычный генератор.
Ответ Создать тему
Опции темы

Текущее время: 12:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru