Как из числа сделать массив c
Перейти к содержимому

Как из числа сделать массив c

  • автор:

Как из числа сделать массив c

Массив представляет набор однотипных данных. Формальное определение массива выглядит следующим образом:

тип_переменной название_массива [длина_массива]

После типа переменной идет название массива, а затем в квадратных скобках его размер. Например, определим массив из 4 чисел:

int numbers[4];

Число элементов массива также можно определять через константу:

const int n = 4; int numbers[n]; // содержит 4 элемента

Некоторые компиляторы (например, G++) также поддерживают установку размера с помощью переменных.

Данный массив имеет четыре числа, но все эти числа имеют неопределенное значение. Чтобы установить значения элементов массива, указываются фигурные скобки (инициализатор), внутри которых перечисляются значения для элементов массива:

int numbers[4] <>; //

В данном случае фигурные скобки пусты, поэтому все элементы массива получают нулевые значения.

Также мы можем указать конкретные значения для всех элементов массива:

int numbers[4] ;

В данном случае в памяти выделяется некоторая область из четырех ячеек по 4 байта (размер типа int), где каждая ячейка содержит определенный элемент массива:

Если значений в инициализаторе меньше, чем элементов в массиве, то значения передаются первым элементам, а остальные получают нулевые значения:

int numbers[4] ; //

Если значений в инициализаторе больше, чем элементов в массиве, то при компиляции возникнет ошибка:

int numbers[4] ; // ! Ошибка

Здесь массив имеет размер 4, однако ему передается 6 значений.

Если размер массива не указан явно, то он выводится из количества переданных значений:

int numbers[] ;

В данном случае в массиве есть 6 элементов.

При этом не допускается присвоение одному массиву другого массива:

int nums1[] ; int nums2[] = nums1; // ошибка

Индексы. Получение и изменение элементов массива

После определения массива мы можем обратиться к его отдельным элементам по индексу. Индексы начинаются с нуля, поэтому для обращения к первому элементу необходимо использовать индекс 0. Обратившись к элементу по индексу, мы можем получить его значение, либо изменить его. Например, получим второй элемент (индекс 1):

int n = numbers[1];

Изменение значения второго элемента:

numbers[1] = 123;

Например, получим и изменим значения элементов:

#include int main() < int numbers[4]; int first = numbers[0]; // получаем первый элемент std::cout 

При обращении по индексу следует учитывать, что мы не можем обратиться по несуществующему индексу. Так, если в массиве 4 элемента, то мы можем использовать индексы с 0 до 3 для обращения к его элементам. Использование любого другого индекса приведет к ошибке:

int numbers[4]; int forth = numbers[4]; // !Ошибка - в массиве только 4 элемента

Константные массивы

Если необходимо, чтобы нельзя было изменять значения элементов массива, то такой массив можно определить как константный с помощью ключевого слова const

const int numbers[4]; // numbers[1] = 23; // ошибка - значения элементов массива изменить нельзя

Длина массива

Длина массива не всегда бывает известна. Однако может потребоваться получить ее. Для этого можно использовать несколько способов. Первый способ, который пришел из языка С, представляет применение оператора sizeof :

#include int main() < int numbers[]; std::cout 

По сути длина массива равна совокупной длине его элементов. Все элементы представляют один и тот же тип и занимают один и тот же размер в памяти. Поэтому с помощью выражения sizeof(numbers) находим длину всего массива в байтах, а с помощью выражения sizeof(numbers[0]) - длину одного элемента в байтах. Разделив два значения, можно получить количество элементов в массиве.

Второй способ представляет применение встроенной библиотечной функции std::size() :

#include int main() < int numbers[]; int count = std::size(numbers); std::cout 

Перебор массивов

Используя циклы, можно пробежаться по всему массиву и через индексы обратиться к его элементам:

#include int main() < const int n = 4; int numbers[n] ; for(int i=0; i < n; i++) < std::cout >

Чтобы пройтись по массиву в цикле, надо знать его длину. Здесь длина задана константой n.вначале надо найти длину массива. И в цикле for перебираем все элементы, пока счетчик i не станет равным длине массива. В итоге на консоль будут выведены все элементы массива:

11 12 13 14

Другой пример - вычислим сумму элементов массива:

#include int main() < int numbers[]; int sum <>; for (int i <>; i < std::size(numbers); sum += numbers[i++]); std::cout 

Здесь длина массива вычисляется динамически - с помощью функции std::size() .

Перебор элементов в стиле for-each

Используем другую форму цикла for , которая предназначена специально для перебора последовательностей, в том числе для массивов

#include int main() < int numbers[4] ; for(int n : numbers) < std::cout >

При переборе массива каждый перебираемый элемент будет помещаться в переменную number, значение которой в цикле выводится на консоль.

Если нам неизвестен тип объектов в массиве, то мы можем использовать спецификатор auto для определения типа:

for(auto n : numbers)

Ввод значений массива с консоли

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

#include int main() < const int max ; // максимальная длина массива - не больше 6 чисел int numbers[max]; // массив для ввода чисел int i<>; // счетчик введенных чисел std::cout > numbers[i]; // вводим число i++; > // выводим массив for (i =0; i < max; ++i) < std::cout std::cout

Здесь в цикле сначала вводятся шесть чисел для каждого элемента массива, затем выводим этот массив.

Как разбить число на элементы массива в с++?

Необходимо разбить вводимое число на элементы массива чтобы каждый элемент был разрядом числа.
informatics.mccme.ru/mod/statements/view3.php?id=2.
Это ссылка на задачу, которую мне необходимо решить. Я планирую решить ее следующим образом. Разбить два входных числа на массивы. Потом потом найти все парные элементы и заключить их в массив. отсортировав по убыванию просто вывести массив. Хотел бы получить ответ на поставленный вопрос, либо альтернативный способ решения..^_^

  • Вопрос задан более трёх лет назад
  • 7522 просмотра

Комментировать
Решения вопроса 1
То, что вы хотите сделать:

#include using namespace std; const int N = (int)1e5+1; string s; int a[N]; int main() < cin >> s; int idx = 0; for (int i = 0; i < s.length(); i++) < a[idx] = s[i] - '0'; idx++; >for (int i = 0; i < idx; i++) < cout return 0; >

Вариант покороче:

#include using namespace std; const int N = (int)1e5+1; string s; int a[N]; int main() < cin >> s; int idx = 0; for (int i = 0; i

Вариант с векторами:

#include using namespace std; const int N = (int)1e5+1; string s; vector a[N]; int main() < cin >> s; for (int i = 0; i

Ответ написан более трёх лет назад
Нравится 1 13 комментариев
Денис Загаевский @zagayevskiy
ну и зачем?
Павел Жиронкин @PaulinhoZh Автор вопроса

Спасибо! Я успел посмотреть решение правда. Но я подобное писал уже на 85 баллов на питоне. Ваше тоже зашло на 85. Но все равно большое спасибо!

Вариант покороче:
.

for (int i = 0; i < s.length(); i++) a[idx++] = s[i] - '0';

Не пиши в одну строку, это вредно для отладки. Там тебе номер строки напишут и скажут, что там ошибка, а ты будешь гадать, а где в этой строке ошибка, ведь там миллион операторов разных. И в результате будешь разбивать её обратно в тот вид, в котором она и должна была быть изначально.

abcd0x00:
Здесь всё предельно просто, и я не считаю необходимым разделять это на несколько строк.

AleexF: а зачем укоротил? Чтобы показаться умнее? Так вот, код укорачивается не за счёт стирания переводов строк, а за счёт применения более оптимального алгоритма. Вот тогда строки и сокращаются.
Ну, и почитай книги какие-нибудь, чтобы видеть эталон.

AleexF:
Вот это тоже хрень полная

const int N = (int)1e5+1;

Во-первых в C++ не принято юзать такое приведение (оно для совместимости с сишными программами оставлено), а во-вторых, оно там не нужно, потому что и так выполняется.

abcd0x00: Это default code называется. Почитай про олимпиадное программирование, может поймёшь

abcd0x00: Я занимаюсь спортивным программированием и считаю твои советы не уместными. Ах да, кстати, я имел ввиду визуально сократил, но ты видимо читаешь код на ассемблере..

Это default code называется. Почитай про олимпиадное программирование, может поймёшь

Это не default code, это ты не знаешь язык.

Вот так это записывается
const int N = 1e5+1;
а приведение выполняется автоматом (неявное приведение типа это называется).

Я занимаюсь спортивным программированием и считаю твои советы не уместными.

Начинай заниматься уже чем-нибудь серьёзным. А в серьёзном очень важна читаемость кода, потому что разработка происходит обычно десятками разных человек, незнакомых друг с другом. Если ты включишься в серьёзную разработку, ты поймёшь, о чём я говорю, когда начнёшь разбираться в чужом коде (кода на мегабайт, а разбираться нужно быстро через отладчик, и тут какой-то дуралей всё в одну строку записал; ты в итоге будешь тратить время на обратное раскладывание за ним, либо не будешь понимать программу).

AleexF: кстати, в любом случае может возникнуть переполнение что с приведением, что без, потому что int нужно предполагать равным short int, а тот на текущих системах больше 32767 вмещать не может, так что твои 100001 его просто переполнят на каком-нибудь компиляторе, где int не равен long int, и там будет случайное число.

abcd0x00: Я не разрабатываю софт. Я решаю поставленные задачи.

AleexF: а зачем тогда делаешь варианты покороче, если варианты подлиннее уже решают поставленные задачи? Запутался?

Мне так больше нравиться. Чтобы у тебя не было 100500 строк кода, где ты делаешь простейшие вычисления

Ответы на вопрос 3
Максим @khrisanfov
Программист

Во-первых в C++ нет возможности работать с разрядами, минимальный размер это char. Во-вторых ввод пользователя поступает в виде строки (массив char), числа тут вообще не причем (символы можно сортировать также как и числа).

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Денис Загаевский @zagayevskiy
Android developer at Yandex

Тебе не надо читать числа, тем более, 100000 знаков - это длинная арифметика. Надо просто посимвольно читать ввод. Задача простая.

Ответ написан более трёх лет назад
Павел Жиронкин @PaulinhoZh Автор вопроса
Я, наверное, не понимаю, но ввод производится одним числом. Я и хочу его разбить на цифры..
Денис Загаевский @zagayevskiy

Павел Жиронкин: Ты не понимаешь. Не надо рассматривать это "в тупую", как написано в условии. Никакого отношения к решению то, что это числа не имеет. Рассматривай это просто как набор символов.

Павел Жиронкин @PaulinhoZh Автор вопроса

Денис Загаевский: Я пишу на С++ две недели.. Много не знаю, много не понимаю.. Я не знаю, как посимвольно читать ввод. Напишите сюда пожалуйста, как это сделать)

Денис Загаевский @zagayevskiy
Павел Жиронкин: stackoverflow.com/questions/12240010/how-to-read-f. читайте, юноша.

Rsa97

Для правильного вопроса надо знать половину ответа

Учитывая, что в условии допускается 100000-значное число, то работать с ним как с числом в С++ так просто не получится. Задача решается с помощью подсчёта цифр как символов вводимых строк. Для каждой из двух входных строк надо посчитать количество каждых цифр. Получится два массива по 10 элементов. Затем, начиная с 9 надо вывести цифры в количестве, равном минимальному из двух значений соответствующих ячеек массива.
Например:

280138 798081 Первый массив: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | Второй массив: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 1 | Минимумы: | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---+---+---+---+---+---+---+---+---+---+ | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Результат: 8810

Перевод числа в массив

Здравствуйте. У такой меня вопрос: могу ли я перевести n-значное число в массив из n элементов. Например 123 = <1, 2, 3>.
Мне нужно для решения задачи по длинной арифметике на срр.
Или может лучше считать число каким-либо другим способом, чтобы потом поразрядно складывать с другим?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Перевод числа в массив.
В программе есть функция, которая принимает на вход целое число и символьный массив(строку). Нужно.

перевод из числа в прописной вид не массив
Здравствуйте товарищи!Нужна ваша помощь в исправлении кода. Что нужно мне изменить в коде что бы.

Функция: перевод числа с плавающей точкой в текст (массив char-ов)
Задача звучит так написать функцию перевода числа с плавающей точкой(double) в текст (массив.

Перевод числа из одной с.с. в другую, манипуляции с цифрами числа
Здравствуйте! У меня такая проблема. Есть программа, выполняющая определенные операции с.

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

Можно записать в char str[]. Функцией itoa(int val,char*buf, 10) //Вроде такой прототип.
Затем вычесть у каждого элемента строки '0'.
И записать это в int A[]. Может поможет

Добавлено через 3 минуты

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int main() { char Str[255]; int Arr[255], Val=0; Val=345; itoa(Val, Str, 10); for(int i=0;istrlen(Str);i++) { Str[i]=Str[i]-'0'; Arr[i]=Str[i]; std::cout<"Arr: " [i] <'\n'; } return 0; }

113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int n=0; int temp; while (x>0) { mas[n]= x%10; x= x/10; n++; } for (int i=0; in/2; i++) { temp= mas[i]; mas[i]= mas[n-i-1]; mas[n-i-1]= temp; }

Регистрация: 02.07.2010
Сообщений: 19
Все работает, но когда число большое например 16854684351461, он выводит 0. Почему.
1260 / 798 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
А не слишком ли большое число для int
Регистрация: 02.07.2010
Сообщений: 19

В том то и дело. Мне надо вводить цифры от 0 до 10^100. Потом поразрядно складывать с таким же большим числом. Ну длинная арифметика. Я делал как то сумму массивов. получилось, теперь просто числа даны большие, не могу придумать

113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
kzht91, сразу считывай в массив да и все
вот как считать с файла

1 2 3 4
char str[1000]; fscanf(f, "%s", str); for(i=0; istrlen(str); i++) mas[i]= str[i]-'0';

Регистрация: 02.07.2010
Сообщений: 19

Во спасибо!)))) Заработало!)))

Добавлено через 4 часа 47 минут
Блин весь мучался, никак не могу написать код, уже сообразил вроде, но какие то ошибки выходят. Помогите написать эту программу. Это A+B, где А и В не превышают 10^100. Буду признателен.

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
Можешь использовать long long тип. Или скачать библиотеку для длинных чисел
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
kzht91, где хранится длина массива?
ии для таких целей лучше хранить число задом наперед
Регистрация: 02.07.2010
Сообщений: 19

Ну для того чтобы складывать поразрядно и начинать с единиц, т.е. с конца массива

Добавлено через 1 час 22 минуты

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
#include #include #include using namespace std; int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); char sa[102] = {0}, sb[102] = {0}; int i, ma[102], mb[102], r[102] = {0}, str; cin >> sa >> sb; if(strlen(sa) > strlen(sb)) str = strlen(sa); else str = strlen(sb); for(i=0; istr; i++) ma[i] = sa[i] - '0'; for(i=0; istr; i++) mb[i] = sb[i] - '0'; for(i=0; istr; i++) cout  [i]; cout  ; for(i=0; istr; i++) cout  [i]; cout  ; for(i=str-1; i>=0; i--) { r[i] = ma[i] + mb[i]; if(r[i] > 9) { r[i] = r[i]%10; r[i-1]++; } } for(i=0; istr; i++) { cout  [i]; } }

Как перевести число в массив цифр на Си?

Если и это не то, что вам нужно - поясните тогда понятнее, что вам надо.

Отслеживать
ответ дан 26 июл 2017 в 7:45
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
Второй вариант может быть из первого получен путём for (i = 0; i < 20; i++) digs[i] -= '0'; 26 июл 2017 в 18:33 @0andriy Может, только тогда это не int , а еще у вас ряд элементов окажется равен -48. 26 июл 2017 в 19:17

Какой смысл в int для цифр? Во втором вы правы, надо добавить проверку на \0. Всяко быстрее, чем деления.

27 июл 2017 в 7:25

@0andriy Никак не соображу, а как получить строку - как ее делает sprintf - без деления? Если не трудно, подскажите алгоритм.

27 июл 2017 в 10:09
@0andriy Спасибо!
29 июл 2017 в 12:48

  • c
  • массивы
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *