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

Дано N десятков целых чисел. Определить, сколько из них могут составлять геометрическую прогрессию. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Файлы http://www.cyberforum.ru/cpp-beginners/thread127023.html
#include <iostream.h> #include <fstream.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h> void ToFile(); void main()
C++ переведите на С++ из паскаля помогите пожалуйста program zadacha_10; uses crt; type s=record f: string ; {фамилия} fakul: string ; {факультет} god,kurs,vozrost:integer; {дата рождения} end; var http://www.cyberforum.ru/cpp-beginners/thread127013.html
Вычисление суммы и произведения элементов матрицы, находящихся на главной диагонали C++
Задана квадратная матрица размером к на к, составить программу вычисления суммы и произведения элементов матрицы, находящихся на главной диагонали.
Треугольная матрица C++
Как реализовать треугольную матрицу одномерным массивом?
C++ Хафман http://www.cyberforum.ru/cpp-beginners/thread126996.html
День добрый. Помогите разобраться с алгоритмом сжатия хафмана. Я так понимаю есть статистика текста она читается из файла. строим бинарное дерево и обходим его. Киньте хотя бы ссылок на инфу где почитать что нежно для написания кода. Учитывая что си я практически не знаю.
C++ Код С++ (граф) Задание: На плоскости задано множество n произвольным образом пересекающихся отрезков прямых линий. Перечислить множество всех треугольников, образованных указанными отрезками. По сути я немного разобрался, из условия можно понять что нам дан неориентированный, невзвешанный, простой граф. И мы должны пройти его все вершины, просматривая каждую на смежность с другими вершинами, если находится... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.05.2010, 12:30     Дано N десятков целых чисел. Определить, сколько из них могут составлять геометрическую прогрессию.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
//Дано N десятков целых чисел. Определить, сколько из них могут составлять 
//геометрическую прогрессию. Проверку оформит в виде функции.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <algorithm>
#include <ctime>
 
typedef std::vector<size_t> T_int_vect;
 
size_t get_rand()
{
    const size_t period = 50;
    return rand() % period;
}
 
T_int_vect  make_int_arr(size_t sz)
{    
    T_int_vect arr(sz);       
    //Заполняем массив случайными числами.
    srand(static_cast<unsigned>(time(0)));
    std::generate(arr.begin(), arr.end(), get_rand);
    return arr;
}
 
std::ostream& operator<<(std::ostream& os, const T_int_vect& v)
{
    const size_t row_size = 10;
    for(size_t i = 0; i < v.size(); ++i)
    {
        if(i % row_size == 0)
        {
            std::cout << std::endl;
        }
        std::cout << v[i] << ' ';
    }
    return os;
}
 
T_int_vect get_prepared_int_arr(T_int_vect nums)
{
    //Сортируем массив и удаляем одинаковые элементы.
    std::sort(nums.begin(), nums.end());
    T_int_vect::const_iterator new_end 
        = std::unique(nums.begin(), nums.end());
    nums.erase(new_end, nums.end());
    //Удаляем нулевой элемент.
    if(nums.front() == 0) nums.erase(nums.begin());
    return nums;
}
 
size_t get_max_progression_size
    (
        const T_int_vect&  v,
        size_t&            first_progr_elem,
        size_t&            znam
    )
{
    size_t cur_max_progression_size = 0;
    //Обходим вектор.
    for(T_int_vect::const_iterator num_it = v.begin();
        num_it != v.end(); ++ num_it)
    {
        //Для текущего элемента вектора обходим все возможные значения
        //знаменателя геометрической прогрессии.
        size_t max_znam = v.back() / *num_it;
        for(size_t cur_znam = 2; cur_znam <= max_znam; ++cur_znam)
        {            
            size_t cur_max_progr_elem_znam_size = 0;
            //Для текущего знаменателя прогрессии получаем все возможные
            //значения элементов прогрессии и подсчитываем, какие из них
            //есть в массиве.
            for(size_t cur_progr_elem = *num_it; 
                cur_progr_elem <= v.back(); cur_progr_elem *= cur_znam)
            {                
                T_int_vect::const_iterator v_it 
                    = std::find(v.begin(), v.end(), cur_progr_elem);
                if(v_it == v.end())
                {
                    break;
                }
                else
                {
                    ++cur_max_progr_elem_znam_size;                     
                }
                if(cur_max_progr_elem_znam_size > cur_max_progression_size)
                {
                    cur_max_progression_size = cur_max_progr_elem_znam_size;
                    first_progr_elem         = *num_it;
                    znam                     = cur_znam;                    
                }
            }//for(size_t cur_progr_elem = *num_it; 
        }//for(size_t cur_znam = 2; cur_znam <= max_znam; ++cur_znam)
    }//for(T_int_vect::const_iterator num_it = v.begin();
    return cur_max_progression_size;
}
 
void show_progr
    (
        size_t size, 
        size_t first_el, 
        size_t znam
    )
{
    T_int_vect progr;
    size_t cur_elem = first_el;
    for(size_t i = 0; i < size; ++i)
    {
        progr.push_back(cur_elem); 
        cur_elem *= znam;
    }
    std::cout << progr;
}
 
int main()
{
    size_t        n;
    const size_t  n_min = 1;
    const size_t  n_max = 100;
    T_int_vect    start_nums;
    T_int_vect    prepared_nums;    
    size_t        max_progression_size;
    size_t        first_pr_el;
    size_t        zn;
   
    for(;;)
    {        
        std::cout << std::endl
                  << std::endl
                  << std::endl;
        //Запрашиваем у пользователя размер массива.             
        do
        {
            std::cout << "Input array size from ["
                      << n_min
                      << ", "
                      << n_max
                      << "]: ";
            std::cin >> n;
        }while(n < n_min || n_max < n);
        //Создаем массив заданного размера и заполняем его случайными числами.
        start_nums = make_int_arr(n);
        //Выводим этот массив на экран.
        std::cout << std::endl
                  << "Start array: "
                  << start_nums;
        //Сортируем массив и удаляем одинаковые элементы.
        //Удаляем нулевой элемент.
        prepared_nums = get_prepared_int_arr(start_nums);
        //Выводим этот массив на экран.
        std::cout << std::endl
                  << std::endl
                  << "Prepared array: "
                  << prepared_nums;
        //Находим длину максимальной геометрической прогрессии 
        //которую можно составить из чисел массива.
        max_progression_size 
            = get_max_progression_size(prepared_nums, first_pr_el, zn);
        //Выводим это число и саму прогрессию:
        std::cout << std::endl
                  << "Max progr size = "
                  << max_progression_size
                  << std::endl
                  << "Progression: ";
                  show_progr(max_progression_size, first_pr_el, zn);
    }//for
    return 0;
}
 
Текущее время: 20:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru