Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


NiOl, имхо "универсальные" варианты противоречат духу скриптов...
утилит много (тот же AWK), да и WSH всегда под рукой, можно даже совместить в одном файле

на пробу, вариант суммы/разности для 16-разрядных чисел ~ 32 петабайта:
Код: Выделить весь код
@echo off

call :SUM -99000900007 -99000900007
pause>nul& exit

:SUM  %int%  %int%  [%VarSum%]
SETLOCAL EnableDelayedExpansion& set "$af=%~1"& set "$bf=%~2"
  for /f "tokens=* delims=+-0" %%i in ("%$af%") do set "$am=%%i"
  for /f "tokens=* delims=+-0" %%i in ("%$bf%") do set "$bm=%%i"
  for /f "tokens=* delims=0" %%i in ("%$am:~-8%") do set /a "$ah=%$af:~,-8%+0,$al=%%i+0"& if !$ah! lss 0 set "$al=-!$al!"
  for /f "tokens=* delims=0" %%i in ("%$bm:~-8%") do set /a "$bh=%$bf:~,-8%+0,$bl=%%i+0"& if !$bh! lss 0 set "$bl=-!$bl!"

  set /a "$sl=($al)+($bl)"& set "$ml=!$sl:-=!"
  set /a "$sh=($ah)+($bh)+(%$sl:~,-8%+0)"
  
  if %$sh% gtr 0 if %$sl% lss 0 set /a "$sh-=1,$sl=100000000-%$ml:~-8%"
  if %$sh% lss 0 if %$sl% gtr 0 set /a "$sh+=1,$sl=%$ml:~-8%-100000000"
  set $ml=%$sl:-=%& set $ml=0000000!$ml:~-8!
  if %$sh% equ 0 (set "$sf=!$sl!") else set "$sf=%$sh%!$ml:~-8!"
  for /f "delims=" %%i in ("%$sf%") do (
ENDLOCAL& if "%~3"=="" (echo %%i) else set "%~3=%%i")
GoTo :EOF
P.S. алгоритм прост:

- делим число на 2 части по восемь 10-тичных разрядов;
- складываем отдельно младшую/старшую части;
- обрабатываем перенос из младшей в старшую;
- соединяем в одну строку.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:50, 02-11-2010 | #3