Консультация № 49084
14.07.2006, 04:06
0.00 руб.
0 2 2
Здравсвуйте, уважаемые эксперты!

Итак, есть большое число типа int64. Нужно его как-то округлить до заданного числа знаков от начала.
То есть, напрмиер есть:
163839134670
задано число знаков 3. Значит, надо получить 164. Без использования библиотечных функций Си и естественно без плясок с float‘ом.
(К сожалению ассемблера не знаю, возможно там решение этой задачи было бы более красивым.)
Что порекомендуете?

Обсуждение

Неизвестный
14.07.2006, 07:50
общий
это ответ
Здравствуйте, Белкин Алексей!

Смотрите пример в приложении. Проверить нет времени, так что возможны опечатки. Но, думаю, идея понятна. В принципе, алгоритм можно чуть ускорить, будет нужно - пишите.

Приложение:
int64 round64(int64 x,int num){// Считаем длину числа xint64 y=x;int len=0;while(y){ y/=10; len++;}// Убираем по одному все последние символы.y=x;if(len>num){ for(int i=0;i<len-num-1;i++) y/=10; if(y%10>=5) // Если последняя убираемая цифра больше 5, то округляем в большую сторону y=y/10+1; else y/=10;}return y;}// Пример вызоваint64 x=163839134670;int64 y=round64(x,3);
Неизвестный
14.07.2006, 09:00
общий
это ответ
Здравствуйте, Белкин Алексей!
Проблема решается довольно просто - код в приложении

Приложение:
int64 Round(int 64 Num, int Size)//Num - округляемое число, Size - кол-во знаков{ int64 Tmp=Pow(10, Size); //будем делить Num на 10, пока не станет меньше этого числа int Ost; //остаток от деления while (Num>=Tmp) { Ost=Num%10; Num/=10; } if (Ost>=5)//учёт последнего знака - увеличение на 1 Num++; return Num;}
Форма ответа