Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 18:58   #1
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию C++ Перевести строку, в которой записано длинное целое, посимвольно в int массив.

Здравствуйте. Вопрос, наверняка, простой.
У меня есть строка "123456789".
Мне нужно каждый символ из этой строки записать посимвольно в
элементы целочисленного массива, так чтобы получился массив типа:
a[0]=1;
a[1]=2;
ну и так далее...

Код:
    int* a;
    while(optarg[z]!='\0') {size1++;z++;}
    a=new int[size1];
    z=0; 
    for (int i=0; i<size1; i++)
    {
      a[i]=atoi(&optarg[i]);
    }
Так явно неправильно, потому что получается вот такой вот массив, если в optarg записать 123456789

123456789
23456789
3456789
456789
56789
6789
789
89
9

Я так подозревал, что optarg - это строка, т.е. массив символов, т.е. каждый символ можно считать отдельно и записать как отдельное число. Или я не прав? optarg - это аргумент командной строки. использую компилятор g++.
Как всё же будет правильно?
Alendorff вне форума Ответить с цитированием
Старый 07.06.2012, 19:01   #2
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Вообще задание целиком, это написать программу, которая будет складывать, вычитать, умножать длинные числа. Но с длинным числом просто так не поработать, даже long long int не хватит... вот и придумал считать в массив и потом уже писать функции для массивов. Но не могу даже считать нормально... too bad (
Alendorff вне форума Ответить с цитированием
Старый 07.06.2012, 19:58   #3
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
Хорошо

Чтобы работать с "большими" числами лучший вариант использовать тип double. Используя его, можно, например, посчитать факториал чисел до 170 с приемлимой точностью. Если же использовать int можно увидеть чудеса, например если попробовать из числа 123456789 вычесть 123456788 то программа выдаст 8 вместо 1. Все эти чудеса связаны со стандартом IEEE-758, попробуй погуглить, почитать статьи на эту тему (уверен найдешь много много чего интересного), т.к. обычно наряду с этими статьями идут описания методов преодоления некоторых из чудес. Но использовать для этой цели массивы, на мой взгляд не очень-то хорошо. Более ценного ответить не могу на твой вопрос, извиняй
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 07.06.2012, 20:13   #4
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Не знаю, мне показалось наиболее простым решением записать числа в массивы и написать арифметические функции...
Alendorff вне форума Ответить с цитированием
Старый 07.06.2012, 20:44   #5
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

Ммм, мне кажется, я немного не понял проблемы. То есть мы записываем два больших числа в массивы и потом, к примеру, перемножаем их словно на листе бумаги, работая с каждой цифрой отдельно, верно?
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 08.06.2012, 05:32   #6
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Ну да, вроде того...
Alendorff вне форума Ответить с цитированием
Старый 08.06.2012, 09:42   #7
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

Все, я понял, почему у тебя так не получилось. Ты даешь atoi(), адрес элемента, с которого считывать строку. Эта функция переводит в числовой вид всю строку до '\0', вот поэтому она тебе и выводит такие чудеса. Чтобы сделать как ты задумал, придется собрать что-то вроде кластера, состоящего из строковых массивов. Тогда каждый элемент этого кластера (в конце каждого элемента будет '\0') будет переводиться в число.
atoi() переводит в число всю строку. То есть весь массив, начиная с элемента, адрес которого ты ей сунул. А вот как собрать такой кластер я пока что не знаю, попробуй че-нибудь порыть.
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 10.06.2012, 14:25   #8
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Мне помогло:

Код:
a[i] = optarg[i] - '0';
Alendorff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевести массив байтов в int и string на языке Си iukash Общие вопросы C/C++ 2 11.05.2012 10:09
Char строку в int массив (C) Ael Общие вопросы C/C++ 6 06.11.2010 00:22
Длинное целое The riddle Помощь студентам 5 13.06.2009 15:45
Длинное целое The riddle Помощь студентам 0 07.06.2009 11:06
Задание на типовой расчет: Какое наибольшее целое число без знака может быть записано в N двоич.разрядах? Бубликова Фриланс 10 06.12.2008 10:35