Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8

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

29.12.2010, 17:57. Показов 1931. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
(Я делаю на 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2010, 17:57
Ответы с готовыми решениями:

Создать массив трехзначных чисел, сумма цифр которых меньше 8, вывести массив и найти количество этих чисел
создать массив трехзначных чисел, сумма цифр которых меньше 8, вывести массив и найти количество этих чисел

Превратить строку в массив чисел
У меня есть строка, допустим &quot;1,2,3,4&quot;. Мне нужно сделать так, чтобы числа были записаны в массиве.

Массив: Определить массив первых 120 натуральных чисел, сумма цифр которых кратна 7
Определить массив первых 120 натуральных чисел, сумма цифр которых кратна 7 и распечатать его в виде матрицы 10х12

10
Быдлокодер
 Аватар для Darky
512 / 298 / 85
Регистрация: 22.11.2009
Сообщений: 892
29.12.2010, 18:03
Стоп. А в чем проблема то?

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;
ну, да, так и будет
0
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 18:12  [ТС]
Стоп. А в чем проблема то?
проблема в том что это массив с числами, а мне нужно составить из него массив и ЦИФРАМИ
Массив с такими ЧИСЛАМИ я сделал, и у меня вопрос - как переделать этот массив в массив с ЦИФРАМИ, т.е. так:

ЦИФРА: 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.
0
 Аватар для Минич
67 / 67 / 7
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 19:14
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;
1
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 20:11  [ТС]
В Билдере значит будет так:
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-ое вдруг = отрицательному числу), а дальше там идут отрицательные и положительные числа вразнобой ?)
0
 Аватар для vx5
191 / 175 / 12
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 20:28
Получается что у нас массив размером N чисел, т.е. больше чем нужно, а нужно для N цифр, но это особо не важно)
(3. Ещё вопрос, кто-нибудь знает почему на 48 ЧИСЛЕ он уходит в минус, т.е. до 48 числа все числа правильные (46ое = 1134903170, 47ое = 1836311903, а 48-ое вдруг = отрицательному числу), а дальше там идут отрицательные и положительные числа вразнобой ?)
а ты думал, что числа сверху не ограничены ?)) первый бит - бит определяющий знак и когда твое число выходит за допустимые границы, единичка из предыдущего разряда переходит в этот
0
 Аватар для Минич
67 / 67 / 7
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 20:29
По моим расчета 29 символ должен быть 0, для этого стоит поправить 51 твою строку на
C++
1
while(temp || j)
тип int имеет диапазон значение от -2147483648 до 2147483647
а вот тип unsigned int от 0 до 4294967295, хотя на много тебе его тоже не хватит
1
 Аватар для vx5
191 / 175 / 12
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 20:30
решение твоей проблемы со знаком таится в переводе программы на тип double
0
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
29.12.2010, 20:37  [ТС]
Цитата Сообщение от vx5 Посмотреть сообщение
а ты думал, что числа сверху не ограничены ?)) первый бит - бит определяющий знак и когда твое число выходит за допустимые границы, единичка из предыдущего разряда переходит в этот
Спасибо, я именно так и предполагал
я помнил что int ограничивается 2-мя с чем-то миллиардами, так на всякий случай спросил))


Цитата Сообщение от Минич Посмотреть сообщение
По моим расчета 29 символ должен быть 0, для этого стоит поправить 51 твою строку на
да, 29-ый)
Спасибо огромное
0
 Аватар для Минич
67 / 67 / 7
Регистрация: 26.11.2010
Сообщений: 123
29.12.2010, 20:38
Цитата Сообщение от vx5 Посмотреть сообщение
решение твоей проблемы со знаком таится в переводе программы на тип double
У double тоже есть придел! Вопрос в другом, нафига такие большие значение? Главное правильная работа алгоритма!
0
 Аватар для vx5
191 / 175 / 12
Регистрация: 04.09.2010
Сообщений: 656
29.12.2010, 21:53
Цитата Сообщение от Минич Посмотреть сообщение
У double тоже есть придел! Вопрос в другом, нафига такие большие значение? Главное правильная работа алгоритма!
тем не менее, когда максимальное значение в 2^32 раза больше, к минусу вы так быстро уже не прийдете

Добавлено через 1 минуту
и ПРАВИЛЬНАЯ работа алгоритма подразумевает избегание таких ситуаций. значит надо проверять достижения предела
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2010, 21:53
Помогаю со студенческими работами здесь

Массив: Превратить заданный массив с несколькими уровнями вложенности в массив с одним уровнем вложенности.
Добрый день. Необходимо выполнить задание: Дано массив: , ], ]. Написать программу, которая превратит заданный массив с...

Сформировать массив, который будет состоять из чисел, входящих как в массив A, так и в массив B
Задание: На основе исходных массивов A и B (n и m – рабочие размеры массивов) сформировать массив C, который будет состоять из чисел,...

Сформировать массив C, который будет состоять из чисел, которые одновременно входят как в массив A, так и в массив B
Есть задание :На основе исходных массивов A и B (n и m – рабочие размеры массивов) сформировать массив C, который будет состоять из чисел,...

Как превратить массив в многомерный?
есть такой массив: =&gt; Acura;CL;1998;2003 =&gt; Acura;EL;1997;2005 =&gt; Acura;ILX;2012;- =&gt; Acura;Integra;1998;2006 ...

Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k
Помогите плиз Превратить массив целых чисел размерности N, удалив из массива все серии, длина которых больше k. Вроде написала...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru