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

Последовательность чисел - C++

Восстановить пароль Регистрация
 
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
29.02.2012, 14:25     Последовательность чисел #1
Добрый день уважаемые форумчане. Вот такой вот вопрос: Есть последовательность чисел с шагом 77, например -103, -26, 51, 128, 205, и т.д. в какой то момент времени появляется случайное число, скажем 200, и далее нам необходимо определить к какому числу из последовательности округлять то есть либо 128 либо 205, для числа 0 это будут (-26 и 51). Подскажите пожалуйста алгоритм работы, или код как построить такую последовательность в момент получения случайного числа, зная начало и шаг, и найти число к которому округлять. Заранее спасибо всем откликнувшимся.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.02.2012, 14:25     Последовательность чисел
Посмотрите здесь:

C++ Задана последовательность из n чисел. Найти количество чисел больше своего номера
Дана последовательность чисел. Найти количество различных чисел в этой последовательности C++
Дана последовательность чисел. Найти количество различных чисел в этой последовательности C++
Вводится последовательность из N целых чисел. Сформировать последовательность, C++
C++ Вводить последовательность вещественных чисел, пока следующее вводимое число не окажется меньше предыдущего. Вывести полученую последовательность.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
29.02.2012, 21:14     Последовательность чисел #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
#include <iostream>
#include <cstdlib>
using namespace std;
 
#define STEP 77 // шаг последовательности
#define BEGIN -103 // начальное значение последовательности
 
// передаем в функцию случайное число ( исходное для проверки ),начальное значение, шаг
int round77( int value_source, int value_begin, int step ) {
    // для уравновешивания отнимаем от исходного числа начальное значение, получаем текущее значение
    int value_current = value_source - value_begin;
    int value_result; // для хранения результата функции
 
    // если текущее значение нацело делится на шаг, то исходное значение округлять не нужно
    if ( !( value_current % step ) )
        return value_source; // его мы и вернем
    else { // а если не делится нацело
        // вычисляем между какими целыми числами находится результат деления текущего значения на шаг
        int koef_first = value_current / step;
        int koef_last = koef_first + 1;
        // вычисляем между какими числами последовательности находится наше случайное число
        int round_first = step * koef_first + value_begin;
        int round_last = step * koef_last + value_begin;
        // вычисляем к какому из чисел последовательности ближе наше случайное число
        if ( abs( round_first - value_source )
                < abs( round_last - value_source ) )
            value_result = round_first;
        else
            value_result = round_last;
 
    }
    return value_result; //и возвращаем это число
}
 
int main() {
 
    cout << "Для значения 167 " << round77( 167, BEGIN, STEP ) << endl;
    cout << "Для значения 166 " << round77( 166, BEGIN, STEP ) << endl;
    cout << "Для значения 32 " << round77( 32, BEGIN, STEP ) << endl;
    cout << "Для значения 200 " << round77( 200, BEGIN, STEP ) << endl;
    cout << "Для значения 263 " << round77( 263, BEGIN, STEP ) << endl;
    cout << "Для значения 128 " << round77( 128, BEGIN, STEP ) << endl;
    return 0;
}
Консоль
Для значения 167 205
Для значения 166 128
Для значения 32 51
Для значения 200 205
Для значения 263 282
Для значения 128 128
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
01.03.2012, 00:28     Последовательность чисел #3
Задачу понял так :
1) Заполнить последовательность с определ.шагом.
2)Сгенерировать число в пределах значений последовательности .
3) Найти в этой последовательности "правого и левого соседа "
для числа .
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
#include <iostream>
#include <time.h>
 
#define BEG -350   //  НАЧАЛО ПОСЛЕДОВАТЕЛЬНОСТИ
#define STEP 77   //   ШАГ
#define N 10   //  ЧИСЛО ЭЛЕМЕНТОВ 
 
//////////////////////////////////////////////////////////////////////////////////
// ПОСЛЕДОВАТЕЛЬНО ЗАПОЛНЯЕМ МАССИВ  С ШАГОМ STEP
void Set(int *arr){
    
    int i ;
    int k = BEG - STEP; // ПЕРВОЕ ЗНАЧЕНИЕ  k = arr[0]
 
    for( i = 0; i < N; i ++,k += STEP){
 
                        arr[i] = k ; 
 
               // ВЫВОДИМ НА ЭКРАН 
 
        std::cout << arr[i] << " "  ;
    }
}
/////////////////////////////////////////////////////////////////////////
//          ИЩЕМ ПРАВОГО И ЛЕВОГО СОСЕДА НАШЕГО ЧИСЛА 
 
void Left_right(int *arr,int val){
 
    int left = 0;
        int right = 0;
 
    //ОПРЕДЕЛЯЕМ ГРАНИЦЫ  : СЧИТАЕМ СО ВТОРОГО ЭЛЕМЕНТА ДО ПРЕДПОСЛЕДНЕГО
    for(int i = 1; i < N - 1; i ++){
 
                if(arr[i] >= val && arr[i - 1] <= val){
 
                            left = arr[i - 1]; 
 
                             right = arr[i];}
 
    }   //                 ВЫВЕСТИ  НА ЭКРАН
std::cout << "\nLEFT element   " << left << "\tRight element   " << right << "\n\n";
}
 
int main()
{
    srand (time(NULL));
      int arr[N];
 
            // ВЫЗОВ ФУНКЦИИ - ЗАПОЛНЯЕМ ПОСЛЕДОВАТЕЛЬНОСТЬ
      std::cout <<  "\n";
    Set(arr);
 
    /////////////////////////////////////////////////////////////////////////////////
 
             // ГЕНЕРИРУЕМ НАШЕ ЧИСЛО  ОТ 1 ДО ЗНАЧЕНИЯ ПОСЛЕДНЕГО ЭЛЕМЕНТА
    int val = 1 + rand()% (arr[N - 1]) ; 
 
           //  ГЕНЕРИРУЕМ ЗНАК  ЧИСЛА
    int sign = rand() % 2; 
 
         // ЕСЛИ sign НЕ РАВЕН НОЛЬ   УМНОЖИТЬ ЧИСЛО НА -1
    if(sign) val *= -1;      
 
          // ВЫВЕСТИ ЧИСЛО НА ЭКРАН
    std::cout << "\n\nValue   " << val << "\n";
 
        // ВЫЗОВ ФУНКЦИИ ПОИСК СОСЕДНИХ ЭЛ - ТОВ 
 
    Left_right(arr,val);
    
    system("pause");}
Добавлено через 1 час 41 минуту
Потестировал. Не совсем корректно работает программа. Если менять

кол-во элементов последовательности .

Код где где генерируется случ.число нужно сменить

(строки 58 - 68)

сменить на
C++
1
2
3
4
5
             // ГЕНЕРИРУЕМ НАШЕ ЧИСЛО  ОТ 1 ДО ЗНАЧЕНИЯ ПОСЛЕДНЕГО ЭЛЕМЕНТА
    int val = 1 +  arr[0] + rand()% arr[N - 1] ; 
 
         // ВЫВЕСТИ ЧИСЛО НА ЭКРАН
    std::cout << "\n\nValue   " << val << "\n";
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
01.03.2012, 11:32  [ТС]     Последовательность чисел #4
Спасибо большое все отлично работает!!

Добавлено через 44 минуты
Roof, все работает хорошо спасибо большое, а не подскажите как можно вычислить порядковый номер в последовательности к которому округляется число.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
01.03.2012, 13:06     Последовательность чисел #5
Начнем с того, что порядковый номер начала 0.
В моей функции
koef_first и koef_last это и есть порядковые номера тех чисел последовательности между которыми наше случайное число value_source
1) Если нужно, каждый раз, обращаясь к функции round77() возвращать еще и порядковый номер, то функцию можно переписать так чтобы она возвращала структуру с двумя полями ( и для случая если случайное число и есть число последовательности - value_current делится нацело на STEP надо дописать несколько строк, ввести переменную koef - порядковый номер и вычислить его делением value_current на STEP ):
- само число последовательности
- его порядковый номер

Если value_result == round_first, то koef_first, а если value_result == round_last, то соответственно koef_last

2) Если нужно только иногда вычислять порядковый номер числа последовательности, то в main() допишите:
C++
1
2
    int value = ( round77( 120, BEGIN, STEP ) - BEGIN ) / STEP ;
    cout << "Порядковый номер для 120 ( будет округлен к 128 )" << value << endl;
Алгортим вычисления порядкового номера прост - отнимаем от числа последовательности BEGIN и делим разницу на STEP.
Yandex
Объявления
01.03.2012, 13:06     Последовательность чисел
Ответ Создать тему
Опции темы

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