请高手们帮忙
我写了一个 但是转码不太成功 不知道偏差出在了哪里
   function n10To64(value) {   var ISNeg=false;
if(value<0)
{
value=Math.abs(value);
ISNeg=true;
}

var i64BitTable = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/');
                  if(value==0)
      return i64BitTable[0]+"";
var retValue="";
while(value!=0)
{
var iValue=(value&0x000000000000003F);
var temp;

temp=i64BitTable[iValue];
retValue=temp+retValue;
value = value>>6;
value=Math.abs(value);
alert(value);
}
if(ISNeg)
retValue="-"+retValue;
return retValue;
    }

解决方案 »

  1.   


    10进制 转为 64进制  即 输入 123456  输出结果为64进制的 eJA
      

  2.   

    function n10To64(value) {
    if (value == 0) return "A";
    var sign = value < 0 ? "-" : "";
    value = Math.abs(value);
    var i64BitTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
    var retValue = [sign];
    while (value > 0) {
    retValue.unshift(i64BitTable[value & 0x3f]);
    value >>= 6;
    }
    return retValue.join("");
    }
    alert(n10To64(123456));
      

  3.   

    不都是eJA吗?哪个转是错的?
      

  4.   


    我输入 1234567891234  return 返回  Bx+wki 但是应 转码为 R9x+wki
      

  5.   

    这个是精度的问题,js number是双精度单精度(Single)和双精度(Double)型数值即为浮点数值,它表示的是带小数的实数。
    单精度型能精确到七位,而双精度能精确到15位。
    javascript中的Number为双精度类型,只能精确到15位。
      

  6.   

    那只能把数字当字符串处理了。
    var n = 12345678901234567890 (javascript实际保存的是:12345678901234567000)var n = "1234567890123456789012345678901234567890"; // 这样以前写过delphi和c#的无限进制转换,晚上翻翻,给你转个js的。
      

  7.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
    <meta name='author' content='Zswang 王集鹄 2011年1月19日'>
    <title>无限进制整数计算</title>
    <script>
    /**
    * 无限进制整数命名空间
    */
    var Integer = Integer || {};
    (function() {
    /**
    * 进制字符串
    */
    var scaleChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";

    /**
    * 向前补零 "1",5 -> "00001"
    * @param {String} n 整数字符串
    * @param {Number} len 长度
    * @return {String} 返回补零后的字符串
    */
    function fullZero(n, len) {
    return new Array(len - n.length + 1).join("0") + n;
    }

    /**
    * 清理整数前面无效的零 "000000001" -> "1"
    * @param {String} n 整数字符串
    * @return {String} 返回格式化后的整数字符串
    */
    function format(n) {
    return n.replace(/^0+(.+)$/, "$1");
    }

    /**
    * 比较两个整数的大小 "1","0" -> +1
    * @param {String} a
    * @param {String} b
    * @return {Number} a>b返回+1,a==b返回0,a<b返回-1
    */
    function compare(a, b) {
    var i = Math.max(a.length, b.length), ta, tb;
    a = fullZero(a, i);
    b = fullZero(b, i);
    for (i = 0; i < a.length; i++) {
    ta = scaleChars.indexOf(a.charAt(i));
    tb = scaleChars.indexOf(b.charAt(i));
    if (ta < tb) return -1;
    if (ta > tb) return +1;
    }
    return 0;
    }
    //console.log(compare("01", "1"));
    //console.log(compare("0a1", "ab1"));

    /**
    * 无限进制的加法
    * @param {String} a 整数1
    * @param {String} b 整数2
    * @param {Number} scale 进制 2-64
    * @return {String} 返回两个数的和
    */
    function add(a, b, scale) {
    if (scale < 2 || scale > 64) return;
    a = format(a);
    b = format(b);
    var i = Math.max(a.length, b.length), t = 0, result = [];
    a = fullZero(a, i);
    b = fullZero(b, i);
    while (i--) {
    t += scaleChars.indexOf(a.charAt(i));
    t += scaleChars.indexOf(b.charAt(i));
    result.unshift(scaleChars.charAt(t % scale));
    t = t / scale;
    }
    if (t) result.unshift(scaleChars.charAt(t % scale));
    return format(result.join(""));
    }
    //console.log(add("19", "1234", 10));

    /**
    * 无限位数乘法函数,单个数乘无限进制整数
    * @param {String} n 整数
    * @param {Number} b 单个数
    * @param {Number} scale 进制 2-64
    * @return {String} 返回n和b的乘积
    */
    function byteMult(n, b, scale) {
    //if (scale < 2 || scale > 64) return;
    var result = [], t = 0, i = n.length;
    while (i--) {
    t = scaleChars.indexOf(n.charAt(i)) * b + t;
    result.unshift(scaleChars.charAt(t % scale));
    t = t / scale;
    }
    if (t) result.unshift(scaleChars.charAt(t % scale));
    return result.join("");
    }
    //console.log(byteMult("555", 12, 10));
    //console.log(byteMult("25", 8, 10));

    /**
    * 无限整数乘法
    * @param {String} a 整数1
    * @param {String} b 整数2
    * @param {Number} scale 进制 2-64
    * @return {String} 返回两个数的乘积
    */
    function mult(a, b, scale) {
    if (scale < 2 || scale > 64) return;
    a = format(a);
    b = format(b);
    var t = "", result = "", i = b.length;
    while (i--) {
    result = add(result, byteMult(a, scaleChars.indexOf(b.charAt(i)), scale) + t, scale);
    t += "0";
    }
    return result;
    }
    //console.log(mult("555", "12", 10)); // 6660
    //console.log(mult("25", "8", 10)); // 200

    /**
    * 无限整数的次方
    * @param {String} base 指数
    * @param {String} exponent 幂数
    * @param {Number} scale 进制 2-64
    * @return {String} 返回base的exponent次方
    */
    function power(base, exponent, scale) {
    if (scale < 2 || scale > 64 || exponent < 0) return;
    base = format(base);
    var result = "1", i = exponent;
    while (i--) {
    result = mult(result, base, scale);
    }
    return result;
    }
    //console.log(power("2", 10, 10)); // 1024

    /**
    * 将一个字符转换为指定进制
    * @param {String} c 单个字符
    * @param {Number} from 来源进制 2-64
    * @param {Number} to 目标进制 2-64
    * @return {String} 返回转换后的数字
    */
    function charDigit(c, from, to) {
    //if (from == to || from < 2 || from > 64 || to < 2 || to > 64 || c == "0") return c;
    var result = "0", t = "0";
    while (compare(t, c) < 0) {
    result = add(result, "1", to);
    t = add(t, "1", from);
    }
    return result;
    }
    //console.log(charDigit("7", 10, 2)); // 111

    /**
    * 进制间的转换
    * @param {String} n 整数
    * @param {Number} from 来源进制 2-64
    * @param {Number} to 目标进制 2-64
    * @return {String} 返回转换后的数字
    */
    function digit(n, from, to) {
    if (from == to || from < 2 || from > 64 || to < 2 || to > 64) return n;
    n = format(n);
    if (n == "0") return n;
    var result = "", base = "1", t = "1", m = scaleChars.charAt(from - 1), l = n.length, i;
    while (compare(t, m) <= 0) {
    base = add(base, "1", to);
    t = add(t, "1", from);
    }
    for (i = 0; i < l; i++) {
    result = add(result, mult(
    charDigit(
    n.charAt(l - i - 1), from, to
    ), power(base, i, to), to),
    to);
    }
    return result;
    }

    //console.log(digit("1024", 10, 2)); // 10000000000
    //console.log(digit("7", 10, 2)); // 111
    //console.log(digit("askdjfas91231as", 64, 7)); // 43425343430315560320062336416102
    //console.log(digit(digit("askdjfas91231as", 64, 7), 7, 64)); // askdjfas91231as // 公开接口
    Integer.add = add;
    Integer.mult = mult;
    Integer.power = power;
    Integer.digit = digit;
    })();
    </script>
    </head>
    <body>
    <script>
    var str = "1234567891234";
    function n10To64(value) {
    if (!value) return;
    value = Integer.digit(value, 10, 64);
    var a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
    var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    return value.replace(/[a-z\d+\/]/ig, function(all) {
    return b.charAt(a.indexOf(all));
    });
    }
    document.write(n10To64(str)); // R9x+wki 
    </script>
    </body>
    </html>为了coding。
      

  8.   

    这是C#的代码,每次重构,我都会优化一下。
    /// <summary>
    /// 进制字符串
    /// </summary>
    const string ScaleChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// <summary>
    /// 对齐前补
    /// </summary>
    /// <param name="AInteger">整数字符串</param>
    /// <param name="ALength">总长度</param>
    /// <returns>返回补后的整数字符串</returns>
    public string IntegerFullZero(string AInteger, int ALength)
    {
        return string.Format("{0," + (ALength - AInteger.Length).ToString() + "}", 
            "").Replace(" ", "0") + AInteger;
    }/// <summary>
    /// 清除无效的
    /// </summary>
    /// <param name="AInteger">整数字符串</param>
    /// <returns>返回处理后的整数字符串</returns>
    public string IntegerFormat(string AInteger)
    {
        string Result = AInteger.ToUpper();
        if (Result == string.Empty) return "0";
        while (Result.IndexOf('0') == 0 && Result != "0")
        {
            Result = Result.Remove(0, 1); //排除整数前无效的
        }
        return Result;
    }/// <summary>
    /// 比较两个整数
    /// </summary>
    /// <param name="AIntegerA">整数</param>
    /// <param name="AIntegerB">整数</param>
    /// <returns>返回比较的值+1、、-1</returns>
    public int IntegerCompare(string AIntegerA, string AIntegerB)
    {
        int i = Math.Max(AIntegerA.Length, AIntegerB.Length);
        AIntegerA = IntegerFullZero(AIntegerA, i);
        AIntegerB = IntegerFullZero(AIntegerB, i);
        return string.Compare(AIntegerA, AIntegerB);
    }/// <summary>
    /// 无限进制的加法
    /// </summary>
    /// <param name="AIntegerA">整数</param>
    /// <param name="AIntegerB">整数</param>
    /// <param name="AScale">进制</param>
    /// <returns>返回两数的和</returns>
    public string IntegerAdd(string AIntegerA, string AIntegerB, byte AScale)
    {
        if (AScale < 2) return string.Empty;
        AIntegerA = IntegerFormat(AIntegerA);
        AIntegerB = IntegerFormat(AIntegerB);
        int i = Math.Max(AIntegerA.Length, AIntegerB.Length);
        AIntegerA = IntegerFullZero(AIntegerA, i);
        AIntegerB = IntegerFullZero(AIntegerB, i);
        int t = 0;
        string Result = string.Empty;
        for (i = i - 1; i >= 0; i--)
        {
            t += ScaleChars.IndexOf(AIntegerA[i]);
            t += ScaleChars.IndexOf(AIntegerB[i]);
            Result = ScaleChars[t % AScale] + Result;
            t = t / AScale;
        }
        if (t != 0) Result = ScaleChars[t % AScale] + Result;
        return IntegerFormat(Result);
    }/// <summary>
    /// 无限位数乘法函数
    /// </summary>
    /// <param name="AInteger">整数</param>
    /// <param name="AByte">位数</param>
    /// <param name="AScale">进制</param>
    /// <returns>返回整数和位数的积</returns>
    private string ByteMult(string AInteger, byte AByte, byte AScale)
    {
        string Result = string.Empty;
        int t = 0;
        for (int i = AInteger.Length - 1; i >= 0; i--)
        {
            t = ScaleChars.IndexOf(AInteger[i]) * AByte + t;
            Result = ScaleChars[t % AScale] + Result;
            t = t / AScale;
        }
        if (t != 0) Result = ScaleChars[t % AScale] + Result;
        return Result;
    }/// <summary>
    /// 无限整数乘法
    /// </summary>
    /// <param name="AIntegerA">整数</param>
    /// <param name="AIntegerB">整数</param>
    /// <param name="AScale">进制</param>
    /// <returns>返回两个整数的积</returns>
    public string IntegerMult(string AIntegerA, string AIntegerB, byte AScale)
    {
        if (AScale < 2) return string.Empty;
        AIntegerA = IntegerFormat(AIntegerA);
        AIntegerB = IntegerFormat(AIntegerB);
        string t = "";
        string Result = string.Empty;
        for (int i = AIntegerB.Length - 1; i >= 0; i--)
        {
            Result = IntegerAdd(Result, ByteMult(AIntegerA,
                (byte)ScaleChars.IndexOf(AIntegerB[i]), AScale) + t, AScale);
            t += "0";
        }
        return IntegerFormat(Result);
    }/// <summary>
    /// 无限整数的次方
    /// </summary>
    /// <param name="ABase">指数</param>
    /// <param name="AExponent">幂数</param>
    /// <param name="AScale">进制</param>
    /// <returns>返回Base的Exponent次方</returns>
    public string IntegerPower(string ABase, int AExponent, byte AScale)
    {
        if (AScale < 2) return string.Empty;
        ABase = IntegerFormat(ABase);
        string Result = "1";
        for(int i = 0; i < AExponent; i++)
        {
            Result = IntegerMult(Result, ABase, AScale);
        }
        return Result;
    }/// <summary>
    /// 将一个字符转换为指定进制
    /// </summary>
    /// <param name="AIntegerFrom"></param>
    /// <param name="AScaleFrom">来源进制</param>
    /// <param name="AScaleTo">目标进制</param>
    /// <returns>返回转换后的数字</returns>
    private string CharDigit(char AIntegerChar, byte AScaleFrom, byte AScaleTo)
    {
        string Result = "0";
        string t = "0";
        while (IntegerCompare(t, string.Empty + AIntegerChar) < 0)
        {
            Result = IntegerAdd(Result, "1", AScaleTo);
            t = IntegerAdd(t, "1", AScaleFrom);
        }
        return Result;
    }  /* CharDigit *//// <summary>
    /// 进制间的转换
    /// </summary>
    /// <param name="AIntegerFrom">来源整数</param>
    /// <param name="AScaleFrom">来源进制</param>
    /// <param name="AScaleTo">目标进制</param>
    /// <returns>返回处理后的整数字符串</returns>
    public string IntegerDigit(string AIntegerFrom, byte AScaleFrom, byte AScaleTo)
    {
        if (AScaleFrom < 2 || AScaleTo < 2) return string.Empty; // 不处理一进制
        AIntegerFrom = IntegerFormat(AIntegerFrom);
        if (AScaleFrom == AScaleTo || AIntegerFrom == "0") return AIntegerFrom;
        string Result = string.Empty;
        string vBase = "1";
        string t = "1";
        while (IntegerCompare(t, string.Empty + ScaleChars[AScaleFrom - 1]) <= 0)
        {
          vBase = IntegerAdd(vBase, "1", AScaleTo);
          t = IntegerAdd(t, "1", AScaleFrom);
        }
        int l = AIntegerFrom.Length;
        for(int i = 0; i < l; i++)
        {
           Result = IntegerAdd(
              Result,
              IntegerMult(
                CharDigit(
                  AIntegerFrom[l - i - 1], AScaleFrom, AScaleTo
                ),
                IntegerPower(
                  vBase,
                  i,
                  AScaleTo
                ),
                AScaleTo),
              AScaleTo
            );
        }
        return Result;
    } /* IntegerDigit */private void button1_Click(object sender, EventArgs e)
    {
        Text = IntegerDigit("32767", 10, 16);
    }
      

  9.   

    这是Delphi的,没有骗你吧,睡觉 囧
    (*//
    标题:无限进制处理
    说明:使用于数学领域进制之间相互转换和计算
    设计:Zswang
    日期:2005-01-15
    支持:[email protected]
    //*)uses Math;const
      cScaleChar: array[0..35] of Char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';function StringToCharSet( //字符串集合
      mString: string //源字符串
    ): TSysCharSet; //返回字符串中包含的集合
    var
      I: Integer;
    begin
      Result := [];
      for I := 1 to Length(mString) do Include(Result, mString[I]);
    end; { StringToCharSet }function StrLeft( //取左边的字符串
      mStr: string; //原字符串
      mDelimiter: string; //分隔符
      mIgnoreCase: Boolean = False //是否忽略大小写
    ): string; //返回第一个分隔符左边的字符串
    begin
      if mIgnoreCase then
        Result := Copy(mStr, 1, Pos(UpperCase(mDelimiter), UpperCase(mStr)) - 1)
      else Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
    end; { StrLeft }function StrRight( //取右边的字符串
      mStr: string; //原字符串
      mDelimiter: string; //分隔符
      mIgnoreCase: Boolean = False //是否忽略大小写
    ): string; //返回第一个分隔符右边的字符串
    begin
      if mIgnoreCase then
      begin
        if Pos(UpperCase(mDelimiter), UpperCase(mStr)) > 0 then
          Result := Copy(mStr, Pos(UpperCase(mDelimiter), UpperCase(mStr)) +
            Length(mDelimiter), MaxInt)
        else Result := '';
      end else
      begin
        if Pos(mDelimiter, mStr) > 0 then
          Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt)
        else Result := '';
      end;
    end; { StrRight }function IntegerFullZero( //对齐前补0
      mInteger: string; //整数字符串
      mLength: Integer //总长度
    ): string; //返回补0后的整数字符串
    begin
      Result := StringOfChar('0', mLength - Length(mInteger)) + mInteger;
    end; { IntegerFullZero }function IntegerCompare( //比较两个整数
      mIntegerA: string; //整数1
      mIntegerB: string //整数2
    ): Integer; //返回比较的值 +1、0、-1
    var
      I: Integer;
    begin
      I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
      mIntegerA := IntegerFullZero(mIntegerA, I);
      mIntegerB := IntegerFullZero(mIntegerB, I);
      Result := CompareText(mIntegerA, mIntegerB);
    end; { IntegerCompare }function IntegerFormat( //清除无效的0
      mInteger: string //整数字符串
    ): string; //返回处理后的整数字符串
    begin
      Result := UpperCase(mInteger);
      if Result = '' then Result := '0';
      while (Pos('0', Result) = 1) and (Result <> '0') do Delete(Result, 1, 1); //排除整数前无效的0
    end; { IntegerFormat }function IntegerAdd( //无限整数加法
      mIntegerA: string; //整数1
      mIntegerB: string; //整数2
      mScale: Byte = 10 //进制
    ): string; //返回两个整数的和
    var
      I: Integer;
      T: Integer;
    begin
      Result := '';
      if mScale < 2 then Exit;
      mIntegerA := IntegerFormat(mIntegerA);
      mIntegerB := IntegerFormat(mIntegerB);
      if StringToCharSet(mIntegerA + mIntegerB) -
        [cScaleChar[0]..cScaleChar[mScale - 1]] <> [] then Exit;
      I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
      mIntegerA := IntegerFullZero(mIntegerA, I); //对齐前补0
      mIntegerB := IntegerFullZero(mIntegerB, I); //对齐前补0
      T := 0; //进位数初始
      for I := I downto 1 do //从后向前扫描
      begin
        T := (Pos(Copy(mIntegerA, I, 1), cScaleChar) - 1) + T; //累加当前数位
        T := (Pos(Copy(mIntegerB, I, 1), cScaleChar) - 1) + T; //累加当前数位
        Result := cScaleChar[T mod mScale] + Result; //计算当前数位上的数字
        T := T div mScale; //计算进位数
      end;
      if T <> 0 then Result := cScaleChar[T mod mScale] + Result; //处理进位数
      while (Pos('0', Result) = 1) and (Result <> '0') do Delete(Result, 1, 1); //排除整数前无效的0
    end; { IntegerAdd }function IntegerSub( //无限整数减法
      mIntegerA: string; //整数1
      mIntegerB: string; //整数2
      mScale: Byte = 10 //进制
    ): string; //返回两个整数的积
    var
      I: Integer;
      T: Integer;
    begin
      Result := '';
      if mScale < 2 then Exit;
      mIntegerA := IntegerFormat(mIntegerA);
      mIntegerB := IntegerFormat(mIntegerB);
      if StringToCharSet(mIntegerA + mIntegerB) -
        [cScaleChar[0]..cScaleChar[mScale - 1]] <> [] then Exit;
      I := Max(Length(mIntegerA), Length(mIntegerB)); //整数部分最大
      mIntegerA := IntegerFullZero(mIntegerA, I); //对齐前补0
      mIntegerB := IntegerFullZero(mIntegerB, I); //对齐前补0
      if mIntegerA < mIntegerB then Exit;
      T := 0; //进位数初始
      for I := I downto 1 do //从后向前扫描
      begin
        T := (Pos(Copy(mIntegerA, I, 1), cScaleChar) - 1) - T; //累加当前数位
        T := T - (Pos(Copy(mIntegerB, I, 1), cScaleChar) - 1); //累加当前数位
        Result := cScaleChar[(T + mScale) mod mScale] + Result; //计算当前数位上的数字
        if T >= 0 then T := 0 else T := 1;
      end;  while (Pos('0', Result) = 1) and (Result <> '0') do Delete(Result, 1, 1); //排除整数前无效的0
    end; { IntegerSub }function IntegerMult( //无限整数乘法
      mIntegerA: string; //整数1
      mIntegerB: string; //整数2
      mScale: Byte = 10 //进制
    ): string; //返回两个整数的积  function fMult( //无限位数乘法子函数
        mInteger: string; //整数
        mByte: Byte //位数
      ): string; //返回位数和整数的积
      var
        I: Integer;
        T: Integer;
      begin
        Result := '';
        T := 0;
        for I := Length(mInteger) downto 1 do //从后向前扫描
        begin
          T := (Pos(Copy(mInteger, I, 1), cScaleChar) - 1) * mByte + T; //累加当前数位
          Result := cScaleChar[T mod mScale] + Result; //计算当前数位上的数字
          T := T div mScale; //计算进位数
        end;
        if T <> 0 then Result := cScaleChar[T mod mScale] + Result; //处理进位数
      end; { fMult }var
      I: Integer;
      T: string;
    begin
      Result := '';
      if mScale < 2 then Exit;
      mIntegerA := IntegerFormat(mIntegerA);
      mIntegerB := IntegerFormat(mIntegerB);
      if StringToCharSet(mIntegerA + mIntegerB) -
        [cScaleChar[0]..cScaleChar[mScale - 1]] <> [] then Exit;
      T := '';
      for I := Length(mIntegerB) downto 1 do
      begin
        Result := IntegerAdd(Result,
          fMult(mIntegerA, (Pos(Copy(mIntegerB, I, 1), cScaleChar) - 1)) + T, mScale);
        T := T + '0';
      end;
      Result := IntegerFormat(Result);
    end; { InfiniteMult }function IntegerDivMod( //无限整数除法
      mIntegerA: string; //整数1
      mIntegerB: string; //整数2
      var nDiv: string; //返回除数
      var nMod: string; //返回余数
      mScale: Byte = 10 //进制
    ): Boolean; //返回两个整数的积
    var
      T: string;
      K: string;
    begin
      Result := False;
      if mScale < 2 then Exit;
      mIntegerA := IntegerFormat(mIntegerA);
      mIntegerB := IntegerFormat(mIntegerB);
      if StringToCharSet(mIntegerA + mIntegerB) -
        [cScaleChar[0]..cScaleChar[mScale - 1]] <> [] then Exit;
      if mIntegerB = '0' then Exit;
      Result := True;
      nDiv := '0';
      while IntegerCompare(mIntegerA, mIntegerB) >= 0 do
      begin
        T := mIntegerB;
        K := '1';
        while IntegerCompare(mIntegerA, T + '0') >= 0 do
        begin
          T := T + '0';
          K := K + '0';
        end;
        mIntegerA := IntegerSub(mIntegerA, T, mScale);
        nDiv := IntegerAdd(nDiv, K, mScale);
      end;
      nMod := mIntegerA;
    end; { IntegerDivMod }function IntegerFactorial( //无限整数的阶乘
      mInteger: Integer; //整数
      mScale: Byte = 10 //进制
    ): string; //返回整数的阶乘
    var
      I: Integer;
      T: string;
    begin
      Result := '';
      if mScale < 2 then Exit;
      Result := '1';
      T := '0';
      for I := 1 to mInteger do
      begin
        T := IntegerAdd(T, '1', mScale);
        Result := IntegerMult(Result, T, mScale);
      end;
    end; { InfiniteFactorial }function IntegerPower( //无限整数的次方
      mBase: string; //指数
      mExponent: Integer; //幂数
      mScale: Byte = 10 //进制
    ): string; //返回Base的Exponent次方
    var
      I: Integer;
    begin
      Result := '';
      if mScale < 2 then Exit;
      mBase := IntegerFormat(mBase);
      if StringToCharSet(mBase) -
        [cScaleChar[0]..cScaleChar[mScale - 1]] <> [] then Exit;
      Result := '1';
      for I := 1 to mExponent do
        Result := IntegerMult(Result, mBase, mScale);
    end; { IntegerPower }function IntegerDigit( //进制间的转换
      mIntegerFrom: string; //来源整数
      mScaleFrom: Byte; //来源进制
      mScaleTo: Byte //目标进制
    ): string; //返回处理后的整数字符串
      function fIntegerDigit( //进制间的转换
        mIntegerFrom: Char //来源整数
      ): string; //返回处理后的整数字符串
      var
        T: string;
      begin
        Result := '0';
        T := '0';
        while IntegerCompare(T, mIntegerFrom) < 0 do
        begin
          Result := IntegerAdd(Result, '1', mScaleTo);
          T := IntegerAdd(T, '1', mScaleFrom);
        end;
      end;
    var
      I, L: Integer;
      vBase: string;
      T: string;
    begin
      Result := '';
      if (mScaleFrom < 2) or (mScaleTo < 2) then Exit;
      mIntegerFrom := IntegerFormat(mIntegerFrom);
      if StringToCharSet(mIntegerFrom) -
        [cScaleChar[0]..cScaleChar[mScaleFrom - 1]] <> [] then Exit;
      if mScaleFrom = mScaleTo then
      begin
        Result := mIntegerFrom;
        Exit;
      end;
      Result := '0';
      if mIntegerFrom = '0' then Exit;
      vBase := '1';
      T := '1';
      while IntegerCompare(T, cScaleChar[mScaleFrom - 1]) <= 0 do
      begin
        vBase := IntegerAdd(vBase, '1', mScaleTo);
        T := IntegerAdd(T, '1', mScaleFrom);
      end;
      L := Length(mIntegerFrom);
      for I := 1 to L do
      begin
        Result := IntegerAdd(
          Result,
          IntegerMult(
            fIntegerDigit(
              mIntegerFrom[L - I + 1]
            ),
            IntegerPower(
              vBase,
              I - 1,
              mScaleTo
            ),
            mScaleTo)
          mScaleTo
        );
      end;
    end; { IntegerDigit }function NumberExpression(mNumber: string): string;
    var
      vExponent: Integer;
      vBase: string;
      L: Integer;
    begin
      Result := '';
      vBase := StrLeft(mNumber, 'e', True);
      vExponent := StrToIntDef(StrRight(mNumber, 'e', True), 0);
      L := Length(StrRight(vBase, '.'));
      vBase := StringReplace(vBase, '.', '', [rfReplaceAll]);
      Result := vBase + StringOfChar('0', vExponent - L);
    end; { NumberExpression }//Example
    procedure TForm1.Edit1Change(Sender: TObject);
    var
      vDiv, vMod: string;
    begin
      Edit3.Text := IntegerAdd(Edit1.Text, Edit2.Text, 10);
      Edit4.Text := IntegerMult(Edit1.Text, Edit2.Text, 10);
      Edit5.Text := IntegerSub(Edit1.Text, Edit2.Text, 10);
      IntegerDivMod(Edit1.Text, Edit2.Text, vDiv, vMod, 10);
      Edit6.Text := vDiv;
      Edit7.Text := vMod;
      Edit8.Text := IntegerDigit(Edit1.Text, 36, 23);
      Edit9.Text := IntegerDigit(Edit8.Text, 23, 36);
      CheckBox2.Checked :=
        IntegerCompare(IntegerAdd(IntegerMult(vDiv, Edit2.Text), vMod), Edit1.Text) = 0;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Text := IntegerFactorial(1000, 20);
    end;