crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> найти самое круглое число между двумя заданными
mezmay
  опции профиля:
сообщение 20.3.2010, 16:35
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Нужна функция, которая бы быстро могла найти самое круглое целое число между двумя заданными. Например:
f(9, 11) = 10;
f(121, 199) = 150;
f(1, 9999) = 5000;

есть моя медленная реализация (долго на больших, сильно удаленных друг от друга числах):
int round(const int &I1, const int &I2)
{
    register int i1 = I1;
    register int i2 = I2;
    int result = -1;

    //основа всех круглых чисел
    register int cel[3];
    cel[0] = 1;
    cel[1] = 2;
    cel[2] = 5;

    int znak = 1;
    if(i2<0)
    {
        int sw = i1;
        i1 = -i2;
        i2 = -sw;
        znak = -1;
    }
            // ноль - самое круглое число
    if(i1 < 0 && i2 > 0 || i1 == 0 || i2 == 0 )
        result = 0;
    else
    {    
                        // в общем случае делим каждое из чисел, расположенных
                        //между заданными, на круглые из массива (пока делятся)
        register int count = 0;
        register int j=0;
        do
        {
            register int i = i1;
            register int cnt = 0;
            do
            {
                if(i%cel[j] == 0)
                {
                    cnt ++;
                    result = i;
                }
                i++;
                count  = cnt;
            } while (cnt < 1 && i < i2);
            j++;
            if(j == 3)
            {
                for(int k=0; k<3; k++)
                    cel[k] *= 10;
                j=0;
            }
        } while (count > 0);
    }
    return result*znak;    
}


вопрос - КАК сделать это быстрее?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
BRE
  опции профиля:
сообщение 20.3.2010, 17:23
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


f(121, 199) = 150;
А в этом случае ответ точно должен быть 150, а не 160?

Что должна вернуть функция, при:
f(22, 23) = ?

Если работать с целыми числами, то я бы начал пробовать с этого:
int round( int I1, int I2 )
{
        return ((I1 + I2) / 2) / 10 * 10;
}


Опиши подробней свойства функции.


Сообщение отредактировал BRE - 20.3.2010, 17:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 2:53