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

Как массив разнозначных чисел превратить в массив цифр? (С++) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 17:57     Как массив разнозначных чисел превратить в массив цифр? (С++) #1
(Я делаю на Builder 6, С++ на консоли)

У меня в курсаче есть такое задание:
Для введённого целого числа N определить N-ую ЦИФРУ последовательности.
Последовательность составляется так:
Это ЧИСЛА Фибоначчи, Последующее = сумме двух предыдущих (F[n] = F[n-1] + F[n-2])
Даны F[0] = 0, F[1] = 1.
Т.е. дальше будет так: F[2] = F[1] + F[0] = 1, F[3]=1+1=2, F[4]=2+1=3 и т.д. будут такие ЧИСЛА:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,...
ещё например F[25] = 75025, F[30] = 832040.

Массив с такими ЧИСЛАМИ я сделал, и у меня вопрос - как переделать этот массив в массив с ЦИФРАМИ, т.е. так:

ЦИФРА: 0,1,1,2,3,5,8,1,3,2,1,3,4,5,5,8,9,1,4,4,2,3,3,3,7,7,6,1,0,9,8,7,1,5,9,7,...
номер : 1,2,3,4,5,6,7,8,9,...

Например мы вводим число N = 7, тогда цифра из последовательности будет = 8, или вводим число N = 14, тогда цифра будет = 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
int main()
{
  int n;
  cout << "Vvedite naturalnoe chislo n:";
  cin >> n;
    if(n == 0 || n < 0)
      {
      cout << "Nekorrektniy vvod";
      getch();
      return 1;
      }
 
int *F = new int[n];
 
F[0] = 0;
F[1] = 1;
 
  for(int i=2; i<(n+1); i++)
    F[i] = F[i-1] + F[i-2];
 
// cout << n << "-aja cifra posledovatel'nosti = " << F[n] << endl;
 
 
getch();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2010, 17:57     Как массив разнозначных чисел превратить в массив цифр? (С++)
Посмотрите здесь:

Дан двухмерный массив размерностью NхМ, превратить его в одномерный. C++
дан массив char[22] как превратить отдельные байты в int, short C++
C++ как подсчитать сумму цифр в массиве из двузначных чисел? массив вводится в цикле от 10 до 99.
C++ Создать массив из 7 чисел, и определить кол-во цифр в каждом числе, без знаков + и - а так же , и т.д
C++ Задача: Функция получает одномерный массив и возвращает количество чисел с суммой цифр больше 20. Почему не работает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
29.12.2010, 18:03     Как массив разнозначных чисел превратить в массив цифр? (С++) #2
Стоп. А в чем проблема то?

C++
1
2
3
4
5
for(int i=2; i<(n+1); i++)
{
F[i] = F[i-1] + F[i-2];
}
 cout << n << "-aja cifra posledovatel'nosti = " << F[n] << endl;
ну, да, так и будет
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 18:12  [ТС]     Как массив разнозначных чисел превратить в массив цифр? (С++) #3
Стоп. А в чем проблема то?
проблема в том что это массив с числами, а мне нужно составить из него массив и ЦИФРАМИ
Массив с такими ЧИСЛАМИ я сделал, и у меня вопрос - как переделать этот массив в массив с ЦИФРАМИ, т.е. так:

ЦИФРА: 0,1,1,2,3,5,8,1,3,2,1,3,4,5,5,8,9,1,4,4,2,3,3,3,7,7,6,1,0,9,8,7,1,5,9,7,...
номер : 1,2,3,4,5,6,7,8,9,...

Например мы вводим число N = 7, тогда цифра из последовательности будет = 8, или вводим число N = 14, тогда цифра будет = 5.
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 19:14     Как массив разнозначных чисел превратить в массив цифр? (С++) #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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n, i;
    cout << "Введите число N (N>0): ";
    cin >> n;
    int *arr = new int[n];
    arr[0] = 0; arr[1] = 1;
    // организация массива Фибаначчи
    for (i = 2; i < n; i++)
        arr[i] = arr[i-2] + arr[i-1];
 
    int k,      // искомое число
        j,      // количество символов в числе
        temp,
        p = 2;  // текущий номер символа
    bool b = false;
 
    if (n > 0 && n < 8) k = arr[n-1];
    else
        for (i = 2; i < n; i++) {
            temp = arr[i];
            j = 0;          
            while (temp) {
                temp /= 10;
                j++;
            }
            temp = arr[i];
            if (j+p < n) {
                p += j;
                continue;
            }
            while(temp) {
                p++;
                if (p == n) {
                    k = static_cast<int>(temp / pow(10.0,j-1));
                    b = true; break;
                }
                temp %= static_cast<int>(pow(10.0,--j));
            }
            if (b) break;
    }
    
    cout << "N-ая цифра последовательности: " << k;
    cin.get();
    cin.get();
}
Добавлено через 29 минут
Забыл, в конце добавить:
C++
1
delete [] arr;
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 20:11  [ТС]     Как массив разнозначных чисел превратить в массив цифр? (С++) #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
#include <vcl.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>
 
int main()
{
        int n, i;
        cout << "vvedite chislo N ( N > 0 ): ";
        cin >> n;
        if(n == 0 || n < 0)
          {
          cout << "Nekorrektniy vvod";
          getch();
          return 1;
          }
 
        int *arr = new int[n];
        arr[0] = 0; arr[1] = 1;
 
        for (i = 2; i < n; i++)
                arr[i] = arr[i-2] + arr[i-1];
 
        cout << n << "-oje chislo posledovatel'nosti = " << arr[n-1] << endl;
 
        int k,
                j,
                temp,
                p = 2;
        bool b = false;
 
 
      if (n > 0 && n < 8)
        k = arr[n-1];
      else
        for (i = 2; i < n; i++)
          {
          temp = arr[i];
          j = 0;
            while (temp)
              {
              temp /= 10;
              j++;
              }
          temp = arr[i];
            if (j+p < n)
              {
              p += j;
              continue;
              }
            while(temp)
              {
              p++;
              if (p == n)
                {
                k = static_cast<int>(temp / pow(10.0,j-1));
                b = true; break;
                }
              temp %= static_cast<int>(pow(10.0,--j));
              }
          if (b) break;
          }
 
cout << n <<"-aja cifra posledovatel'nosti: " << k;
delete [] arr;
getch();
return 0;
}

1. Есть одна проблема - не видит нули! 28 цифра должна быть 0 (это в числе 610), 27 цифра - 1, а 28 он пишет что она - 9 (т.е. из следующего числа 987), и так далее пропускает везде нули и происходит сдвиг на 1 цифру после каждого нуля.

(2. Получается что у нас массив размером N чисел, т.е. больше чем нужно, а нужно для N цифр, но это особо не важно)
(3. Ещё вопрос, кто-нибудь знает почему на 48 ЧИСЛЕ он уходит в минус, т.е. до 48 числа все числа правильные (46ое = 1134903170, 47ое = 1836311903, а 48-ое вдруг = отрицательному числу), а дальше там идут отрицательные и положительные числа вразнобой ?)
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 20:28     Как массив разнозначных чисел превратить в массив цифр? (С++) #6
Получается что у нас массив размером N чисел, т.е. больше чем нужно, а нужно для N цифр, но это особо не важно)
(3. Ещё вопрос, кто-нибудь знает почему на 48 ЧИСЛЕ он уходит в минус, т.е. до 48 числа все числа правильные (46ое = 1134903170, 47ое = 1836311903, а 48-ое вдруг = отрицательному числу), а дальше там идут отрицательные и положительные числа вразнобой ?)
а ты думал, что числа сверху не ограничены ?)) первый бит - бит определяющий знак и когда твое число выходит за допустимые границы, единичка из предыдущего разряда переходит в этот
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 20:29     Как массив разнозначных чисел превратить в массив цифр? (С++) #7
По моим расчета 29 символ должен быть 0, для этого стоит поправить 51 твою строку на
C++
1
while(temp || j)
тип int имеет диапазон значение от -2147483648 до 2147483647
а вот тип unsigned int от 0 до 4294967295, хотя на много тебе его тоже не хватит
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 20:30     Как массив разнозначных чисел превратить в массив цифр? (С++) #8
решение твоей проблемы со знаком таится в переводе программы на тип double
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 20:37  [ТС]     Как массив разнозначных чисел превратить в массив цифр? (С++) #9
Цитата Сообщение от vx5 Посмотреть сообщение
а ты думал, что числа сверху не ограничены ?)) первый бит - бит определяющий знак и когда твое число выходит за допустимые границы, единичка из предыдущего разряда переходит в этот
Спасибо, я именно так и предполагал
я помнил что int ограничивается 2-мя с чем-то миллиардами, так на всякий случай спросил))


Цитата Сообщение от Минич Посмотреть сообщение
По моим расчета 29 символ должен быть 0, для этого стоит поправить 51 твою строку на
да, 29-ый)
Спасибо огромное
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 20:38     Как массив разнозначных чисел превратить в массив цифр? (С++) #10
Цитата Сообщение от vx5 Посмотреть сообщение
решение твоей проблемы со знаком таится в переводе программы на тип double
У double тоже есть придел! Вопрос в другом, нафига такие большие значение? Главное правильная работа алгоритма!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2010, 21:53     Как массив разнозначных чисел превратить в массив цифр? (С++)
Еще ссылки по теме:

Превратить одномерный массив по условию C++
C++ Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k
C++ Односвязный список превратить в массив структур

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

Или воспользуйтесь поиском по форуму:
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 21:53     Как массив разнозначных чисел превратить в массив цифр? (С++) #11
Цитата Сообщение от Минич Посмотреть сообщение
У double тоже есть придел! Вопрос в другом, нафига такие большие значение? Главное правильная работа алгоритма!
тем не менее, когда максимальное значение в 2^32 раза больше, к минусу вы так быстро уже не прийдете

Добавлено через 1 минуту
и ПРАВИЛЬНАЯ работа алгоритма подразумевает избегание таких ситуаций. значит надо проверять достижения предела
Yandex
Объявления
29.12.2010, 21:53     Как массив разнозначных чисел превратить в массив цифр? (С++)
Ответ Создать тему
Опции темы

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