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

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

Войти
Регистрация
Восстановить пароль
 
flames
0 / 0 / 0
Регистрация: 16.06.2013
Сообщений: 34
#1

Последовательность Хэмминга - C++

13.06.2016, 09:32. Просмотров 306. Ответов 6
Метки нет (Все метки)

Последовательность Хэмминга образуют натуральные числа, не имеющие других простых делителей, кроме 2, 3 и 5. Найти: сумму первых N элементов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Ivana
2838 / 1663 / 143
Регистрация: 01.03.2013
Сообщений: 4,757
Записей в блоге: 2
13.06.2016, 16:25     Последовательность Хэмминга #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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <functional>
using namespace std;
 
typedef std::pair<bool, int>  li_t;
typedef std::function<li_t()> fi_t;
 
int main() {
    fi_t nil  = []() -> li_t {return std::make_pair(false, 0);};
    auto null = [](li_t a) -> bool {return !a.first;};
    auto val  = [](li_t a) -> int  {return a.second;};
    
    auto cons = [](int a, const fi_t& l) -> fi_t {
        int p=0; return [=]() mutable -> li_t {
                    if (p) return l(); else {p=1; return std::make_pair(true, a);}};};
    
    auto map = [cons,nil,null,val](const auto& f, const fi_t& l) -> fi_t {
        auto go = [f,cons,nil,null,val](const fi_t& l, const auto& la) -> fi_t {
            li_t e=l(); return null(e) ? nil : cons(f(val(e)), la(l, la));};
        return go(l, go);};
        
    auto show = [null,val](const fi_t& l) -> int {
        auto go = [null,val](const fi_t& l, auto& la) -> int {
            li_t e=l(); if (null(e)) {cout<<'\n'; return 0;}
                        else {cout<<val(e)<<'\t'; return la(l, la);}};
        return go(l, go);};
     
    auto merge = [cons,nil,null,val](const fi_t& a, const fi_t& b) -> fi_t {
        auto go = [cons,nil,null,val](const fi_t& a, const fi_t& b, const auto& la) -> fi_t {
            li_t ea=a(), eb=b();
            return null(ea) && null(eb) ? nil :
                null(ea) ? cons(val(eb), b) : null(eb) ? cons(val(ea), a) :
                val(ea)<val(eb) ? cons(val(ea), la(a, cons(val(eb), b), la)) :
                val(ea)>val(eb) ? cons(val(eb), la(cons(val(ea), a), b, la)) :
                                  cons(val(ea), la(a, b, la));};
        return go(a, b, go);};
    
    auto take = [cons,nil,null,val](int n, const fi_t& l) -> fi_t {
        auto go = [cons,nil,null,val](int i, const fi_t& l, const auto& la) -> fi_t {
            li_t e=l(); return (!i) || null(e) ? nil : cons(val(e), la(i-1, l, la));};
        return go(n, l, go);};
        
    auto equal = [null,val](const fi_t& a, const fi_t& b) -> bool {
        auto go = [null,val](const fi_t& a, const fi_t& b, const auto& la) -> bool {
            li_t ea=a(), eb=b();
            return null(ea) && null(eb) ? true : null(ea) ? false : null(eb) ? false :
                val(ea)==val(eb) ? la(a, b, la) : false;};
        return go(a, b, go);};
   
    auto hammingList = [=](int n) -> fi_t {
        
        auto step = [merge,map,cons](const fi_t& l) -> fi_t {
            auto sc = [map](int n, const fi_t& l) -> fi_t {
                return map([n](int i)->int {return i*n;}, l);};
            fi_t l2=l, l3=l, l5=l;
            return cons(1, merge(sc(2, l2), merge(sc(3, l3), sc(5, l5))));};
            
        auto go = [n,step,take,equal](const fi_t& l, const auto& la) -> fi_t {
            fi_t l0=l, le0=l, l1=step(l), le1=l1;
            if (equal(take(n,le0), take(n,le1))) return take(n,l0);
            else return la(l1, la);};
 
        return go(cons(1,nil), go);};
    
    auto foldr = [cons,nil,null,val](const auto& f, auto a, const fi_t& l) -> fi_t {
        auto go = [f,cons,nil,null,val](auto a, const fi_t& l, const auto& la) -> fi_t {
            li_t e=l(); return null(e) ? a : f(val(e), la(a, l, la));};
        return go(a, l, go);};
    
    int N; cin >> N;
 
    fi_t h = hammingList(N);
    //show(h);
 
    cout << "Sum = " << val(foldr(
        [cons,nil,val](int a, const fi_t& b) -> fi_t {return cons(a+val(b()), nil);},
        cons(0,nil), h) ()) << '\n';
    
    return 0;
}
flames
0 / 0 / 0
Регистрация: 16.06.2013
Сообщений: 34
13.06.2016, 17:13  [ТС]     Последовательность Хэмминга #3
Забыл сказать что программу нужно написать не через функции...
regio1961
105 / 105 / 49
Регистрация: 06.06.2016
Сообщений: 242
13.06.2016, 20:18     Последовательность Хэмминга #4
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
#include <iostream>
 
 bool is_Hamming( const unsigned &k )
 {
       if ( k < 2 )
         return false;
   unsigned test = k;
       while ( !(test % 2) )
         test /= 2;
       while ( !(test % 3) )
         test /= 3;
       while ( !(test % 5) )
         test /= 5;
   return ( test == 1 );
 }
 //-----------------------------------------------------------------
 unsigned long  sum_hamming_numbers( unsigned n )
 {
   unsigned long  sum = 0;
       for ( unsigned  i = 2, counter = 0; counter < n ; ++i  )
       {
             if ( is_Hamming( i ) )
             {
               sum += i;
               ++counter;
             }
       }
   return sum;
 }
 //-----------------------------------------------------------------
 int  main()
 {
   std::cout << sum_hamming_numbers( 5 ) << std::endl;
   //std::cin.get();
   return 0;
 }
flames
0 / 0 / 0
Регистрация: 16.06.2013
Сообщений: 34
14.06.2016, 09:20  [ТС]     Последовательность Хэмминга #5
Не работает. А можно эту программу как бы просто линейно написать?
l_lenskaya
10 / 10 / 2
Регистрация: 02.07.2013
Сообщений: 52
14.06.2016, 10:18     Последовательность Хэмминга #6
flames, Поиск же. Или с паскалем не дружны?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2016, 17:39     Последовательность Хэмминга
Еще ссылки по теме:

C++ Вводится последовательность из N вещественных чисел. Определить, является ли последовательность знакочередующе
C++ код Хэмминга
C++ Коды Хэмминга С++
Как реализовать кодирование кода Хэмминга? C++
Код Хэмминга (Dev C++) C++

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

Или воспользуйтесь поиском по форуму:
flames
0 / 0 / 0
Регистрация: 16.06.2013
Сообщений: 34
14.06.2016, 17:39  [ТС]     Последовательность Хэмминга #7
Нет, не знаю.

Добавлено через 4 часа 18 минут
А вы можете написать?

Добавлено через 1 час 5 минут
Помогите кто нибудь, а то сдавать уже скоро...
Yandex
Объявления
14.06.2016, 17:39     Последовательность Хэмминга
Ответ Создать тему
Опции темы

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