0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
1

Сравнить два int числа расположенных в char* строке

15.07.2013, 13:38. Показов 14326. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем првиет.
Имею проблему связанную с быстродействием.
Нужно сравнить 2 строки на больше/меньше/равно.
Каждый символ строки - число. строка строго 7 символов, т.е. 7 чисел.
При приведении к int через функцию atoi() идет большая задержка (т.к. мильен итераций цикла, где находится данная проверка). Посоветуйте алгоритм сравнения.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2013, 13:38
Ответы с готовыми решениями:

Как сравнить два char string
подскажите сделал задачу которая проверит является ли данная строка палиндромом вот код...

Сравнить два массива типа char
char mass1 = { 'c', 'c', 'a', 'c', 'a', 'd', 'd', 'a', 'b', 'b', 'b', 'a', 'c', 'c', 'a', 'a', 'b',...

Ошибка: cannot convert 'int (*)[50]' to 'int*' for argument '1' to 'void vvod2m(int*, int*, int*, char)'Х2
Матрицы An1*m1 и Bn2*m2 вводить с клавиатуры (размерности >3, m1=n2). Выполнять через подпрограммы....

Как сравнить два указателя типа char?
char *p1; p1 = new char; p1 = "qwert"; char *p2; p2 = new char; p2 = "zz"; if(*p1==*p2)...

21
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 13:45 2
Как на счет функции strcmp ( http://www.cplusplus.com/refer... ?kw=strcmp ) !?
0
70 / 70 / 13
Регистрация: 13.05.2012
Сообщений: 130
15.07.2013, 13:46 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
     char* a="1234567";
     char* b="0123456";
    for(int i=0;i<strlen(a);i++)
    {if(a[i]<b[i])
    {cout<<"<";break;}
    if(a[i]>b[i])
    {cout<<">";break;}
    if(a[i]==b[i])
    {cout<<"==";break;}}
 
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:46  [ТС] 4
не помогает. долго. нужно посимвольно сравнить и принять решения. быстрее if() ничего не работает. Вопрос в алгоритме.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
15.07.2013, 13:47 5
1) Ручками.
2) Получать коды символов и сравнивать их. Не знаю на сколько это будет быстрее, но кажется мне.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 13:47 6
Цитата Сообщение от rn3kk Посмотреть сообщение
не помогает. долго.
Там всего один цикл. Насколько ж быстро тебе надо?
0
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:58  [ТС] 7
у меня данная проверка внутри 3-х циклов проходов по контенерам. конечная точка сравнения так сказать. анализирую код предложенный Valentina,

Добавлено через 1 минуту
символы не нужно приводить к инт. при сравнении все работает нормально. Если нужно получить число, можно отнять 0x30.

Добавлено через 8 минут
Цитата Сообщение от Valentina Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
     char* a="1234567";
     char* b="0123456";
    for(int i=0;i<strlen(a);i++)
    {if(a[i]<b[i])
    {cout<<"<";break;}
    if(a[i]>b[i])
    {cout<<">";break;}
    if(a[i]==b[i])
    {cout<<"==";break;}}
 
    system("pause");
    return 0;
}
но ведь тут просто сравниваем один единственный символ и выходим из цикла.
Мне же необходимо воспринимать все символы строки как одно число.
т.е. char* a="1234567";
это эквивалентно целому числу int c=1234567; как то так.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 14:06 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    char *a = "100";
    char *b = "200";
 
    int c = 0;
    while ( *a ) c += *a++ - *b++;
 
    printf( "%d\n", c );
}
0
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:14  [ТС] 9
lazybiz, необычно. сейчас попробуем.

Добавлено через 2 минуты
lazybiz, у твоего метода есть один недостаток. мы пройдем по всем символам. т.е. если числа 100 и 110 то уже на 2-й итерации можно выйти из цикла.

Добавлено через 2 минуты
может имеет смысл в данном случае ассемблерная вставка?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 14:22 10
Тебе прям не угодишь.. ты не беременный?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    char *a = "1234567";
    char *b = "1235567";
 
    int c = 0;
    while ( *a ) {
        c += *a++ - *b++;
        if ( c ) break;
    }
 
    printf( "%d\n", c );
}
0
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:30  [ТС] 11
lazybiz, =) не русгайся. спасибо. еще не попробоавл твой метод спасибо.

Добавлено через 6 минут
эх.. спасибо друзья. пришлось отказаться от этой затеи. Банальное копирование
Кликните здесь для просмотра всего текста
const char *begin_tmp=(*itRg)->getBegin()

при мегабольшом кол-ве итераций привело к увеличению времени выполнения на 3 минуты. Всем спасибо.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 14:33 12
Я не понял, ты решил свою проблему?
Если нет то может код покажешь с входящими данными?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.07.2013, 14:36 13
А чем рукописный вариант будет быстрее предложенного в начале strcmp? Суть ведь та же.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 14:37 14
Ну может у него компилятор не умеет оптимизировать и не знает что такое inline-функции..
0
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:40  [ТС] 15
пришлось отказаться целиком от данного кода. эта штука, что я делал, нужна для определения инфы о номере телефона по деф кодам от россвязи. Ну и вызывается код для каждого номера, т.е. 200-300 тыс раз.
До этого все было сделано на диком кол-ве if()else. буду писать генератор функции на if() класть его в cpp и потом компилить.. это ужасно....

Добавлено через 1 минуту
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
bool PhoneInfo::GetPhoneInfo( char* Phone,  int* operatorId, int* areaId,  int* regionId){
 
  vector<OperatorInfo*>::iterator itOi;
  vector<AreaInfo*>::iterator itAi;
  vector<Range*>::iterator itRg;
  int i =0;
  for(itOi = oiList->begin(); itOi != oiList->end();  ++itOi ){
    vector<AreaInfo*>* aiList =  (*itOi)->getAreaInfoList();
    for(itAi = aiList->begin(); itAi != aiList->end(); ++itAi){
      vector<Range*>* rangeList = (*itAi)->getRangeList();
      for(itRg = rangeList->begin(); itRg != rangeList->end();  ++itRg){
         const char *def_tmp = (*itRg)->getDef();
         if( Phone[0] !=  def_tmp[0]
             || Phone[1] !=  def_tmp[1]
             || Phone[2] !=  def_tmp[2]) continue;
 
 
         const char *begin_tmp=(*itRg)->getBegin(), *end_tmp=(*itRg)->getEnd();
>>>>>>>>>>>тут код по сравнению строк <<<<<<<<
         *operatorId = (*itOi)->getOpId();
         *areaId = (*itAi)->getAreaId();
         *regionId = (*itAi)->getMacroAreaId();
         return true;   */
      }
    }
  }
 
  *operatorId = 0;
  *areaId = 0;
  *regionId = 0;
  return false;
}
от такие дела ребята.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.07.2013, 14:42 16
Да, это действительно ужасно...
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
15.07.2013, 17:40 17
Цитата Сообщение от rn3kk Посмотреть сообщение
7 чисел.
может быть цифр?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.07.2013, 17:49 18
Цитата Сообщение от Dani Посмотреть сообщение
может быть цифр?
чисел (но от 0 до 9)
0
Dani
15.07.2013, 17:58
  #19

Не по теме:

Tulosba, и сравнить надо 14 чисел тогда :)

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.07.2013, 18:13 20
Цитата Сообщение от Dani Посмотреть сообщение
и сравнить надо 14 чисел тогда
7 пар чисел, да.
0
15.07.2013, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2013, 18:13
Помогаю со студенческими работами здесь

Реализация функции char *padl(const char *string, int len, int c=' ')
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо...

Error C2040:strnset_2:"char *(char *,int,unsigned int)" отличается по уровням косвенного обращения от "int ()"
Не могу найти в чём ошибка. error C2040: strnset_2: &quot;char *(char *,int,unsigned int)&quot; отличается...

записать по-битого один short int в два char
Здрасьте, всем. Записать побитого два char в один short int это: char char1; char char2; short...

Ввести четыре числа: Вывести два наибольших числа. Вывести два из них, расположенных между max и min. Visual Basic
Ввести четыре числа: Вывести два наибольших числа. Вывести два из них, расположенных между max и...

как осуществить приведение типов....(int) char ; (char) int;
Подскажите пожалуйста. мне нужно перевести программу с билдера на дельфи. Есть некоторые нюансы. ...

Форматирование строк, char to int & int to char
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru