|
09.07.2013, 15:44
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
String to int
Какой самый простой способ данного приведения типов? На ум пришла данная функция:
int stringToInt(string s,int n)
{
return (n==0) ? s[n]-'0' : ((s[n]-'0')+10*stringToInt(s,n-1));
}
Можно ли ещё упростить?
В интернете читал о разных стандартных функциях, однако по ответам заметил, что многие из них не(корректно) работают. Поэтому интересуют максимально простые самостоятельные решения, либо те, что точно работают в большинстве стандартных компиляторов.
|
(Offline)
|
|
09.07.2013, 15:49
|
#2
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: String to int
__________________
|
(Offline)
|
|
09.07.2013, 15:54
|
#3
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: String to int
Nope, не работает с самой строкой, только что проверял. Только если переводить из string в char, но как-то много переводов.
|
(Offline)
|
|
09.07.2013, 16:45
|
#4
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: String to int
кроме того есть atoi() и прочие
эм, string.c_str() много переводов? Тупо указатель на кидает на внутренний чар массив.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
|
|
09.07.2013, 20:40
|
#5
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: String to int
в С++0x есть некий std::to_string.
2012 студия его держит
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.07.2013, 15:52
|
#6
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: String to int
всю жизнб atoi() юзал проблем не имел
|
(Offline)
|
|
18.07.2013, 02:02
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: String to int
можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.07.2013, 11:29
|
#8
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: String to int
Сообщение от impersonalis
можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)
|
а как ты сам реализовываешь? бежишь по char и вычисляешь из кода символа? Можешь дать пример, как наиболее шустро сконвертировать. По твоему опыту так сказать.
|
(Offline)
|
|
18.07.2013, 12:02
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: String to int
Нуу, например:
int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0;
for(int i=L,mul=1;i>=Minus;i--,mul*=10)
S+=((str[i]-48)*mul);
S*=1-2*Minus;
Студентам могут попасться дополнительные детали: наличие буквенного мусора в числе, формальных знаков в начале (+) и т.п. Т.е. можно придумать оптимизацию под конкретику (тот же 1-2* вполне можно заменить тернарной конструкцией). Наиболее распростраённые промахи:
1) перебор от начала к концу строки: придётся посчитать тяжёлый множитель через pow, который на каждой итерации ещё и делить на 10 (хотя умножение - при движении в другую сторону - будет быстрее);
2) неиспользование прошлых результатов: вычисление множителя через pow на каждой итерации.
Или вот задание:
генерировать имена файлов типа
file000.bmp,file001.bmp...
Некоторые тоже через itoa фигачат, каждую итерацию теребя дополнительные буферы и делая стркаты, хотя это можно сделать простой манипуляцией, переделывая один буфер.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.07.2013, 13:21
|
#10
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: String to int
Сообщение от impersonalis
Нуу, например:
int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0;
for(int i=L,mul=1;i>=Minus;i--,mul*=10)
S+=((str[i]-48)*mul);
S*=1-2*Minus;
|
спс, примерно так и представлял реализацию ))
|
(Offline)
|
|
18.07.2013, 14:35
|
#11
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: String to int
Сообщение от impersonalis
int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0;
for(int i=L,mul=1;i>=Minus;i--,mul*=10)
S+=((str[i]-48)*mul);
S*=1-2*Minus;
|
Зачем там strlen, двойное умножение и странное отрицание в конце? Проще надо быть:
int simple_atoi ( const char *str )
{
int v = 0;
const bool neg = ( str[ 0 ] == '-' );
for( int i = neg ? 1 : 0; str[ i ] != 0; ++i )
{
v *= 10;
v += ( str[ i ] - '0' );
}
return( neg ? -v : v );
}
но лучше не городить велосипеды и юзать стандартные.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.07.2013, 14:38
|
#12
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: String to int
int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0;
for(int i=L,mul=1;i>=Minus;i--,mul*=10)
S+=((str[i]-48)*mul);
S*=1-2*Minus;
не читабельно. особенно вот это: for(int i=L,mul=1;i>=Minus;i--,mul*=10)
можно i вообще выкинуть.
for(int mul=1;L>=Minus;L--,mul*=10)
хотя читабельность много важнее минимально числа строчек. я бы вообще написал как-то так:
int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0, mul = 1, first_number = Minus?1:0;
while(L>first_number)
{
S+=((str[L]-'0')*mul);
--L;
mul *= 10;
}
if(minus)
S = -S;
да, тут есть по сути лишние строчки, типа first_number = Minus?1:0. которые делают совершенно лишнюю работу. но, если это не глубоко в ядре, то читабельность важнее.
Platon опередил. вот его вариант в разы читабельне, имхо.
|
(Offline)
|
|
19.07.2013, 13:53
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: String to int
Сообщение от Platon
Зачем там strlen, двойное умножение и странное отрицание в конце? Проще надо быть:
....
|
Сообщение от HolyDel
...
не читабельно. особенно вот это: ... я бы вообще написал как-то так:
...
Platon опередил. вот его вариант в разы читабельне, имхо.
|
ну как всегда:
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:09.
|