高精度总结

整数>>字符串(高精度常用):
string int_to_str(int a)  //整数转为字符串

{

         string result;

         while(a)

         {

                   result.insert(0,1,a%10+'0');

                   a /= 10;

         }

         return result;

}
字符串>>整数:

int str_to_int(string a)

{

     int result = 0;

     int s = 0;

     while(s<a.size())

         result = result*10 + a[s++]-'0';

     return result;
}


加法:
string high_add(string a,string b)

{

     a.insert(0,1,'0');

     b.insert(0,1,'0');

     if(a.size()>b.size())

         b.insert(0,(int)a.size()-(int)b.size(),'0');

     else if(a.size()<b.size())

         a.insert(0,(int)b.size()-(int)a.size(),'0');

     int ci = 0;

     int N = a.size();

     int x = 0;

     for(int i = N-1;i>=0;i--)

     {    x = a[i]-'0'+b[i]-'0'+ci;

         if(x>=10)

         {    ci = x/10;  //顺序不能颠倒

              x  = x%10;

         }

         else

              ci = 0;

         a[i] = x + '0';

     }

     while(1)//输出控制

     {    if(a[0]=='0'&&a.size()!=1)

         {

              a.erase (a.begin (),a.begin ()+1);       

         }

         else break;

     }

     return a;

}

减法:(直接利用加法)

乘法:
string high_mut(string a,string b)  //还利用了vector<int>,算法有待改进

{

         vector<int> X;    //转换到vector<int> 中

         vector<int> Y;

int N = a.size();

         X.assign(N,0);

        int M = b.size();

         Y.assign(M,0);

         for(int i = 0;i<N;i++)

                   X[i] = a[i]-'0';

         for(int i = 0;i<M;i++)

                   Y[i] = b[i]-'0';

         vector<int> R;

         R.assign(N+M,0);

                              //计算

         string result;

         int c = 0;

         for(int i = M-1;i>=0;i--)

         {

                   int site = N+M-1;

                   for(int j = N-1;j>=0;j--)

                   {

                            R[site-c] += X[j]*Y[i];

                            site--;

                   }

                   c++;

         }

         for(int i = N+M-1;i>=0;i--)

         {

                   if(R[i]>=10)

                   {

                            R[i-1] += R[i]/10;

                            R[i] = R[i]%10;                    

                   }

                   result.insert(0,1,R[i]+'0');

         }

         //输出控制

         while(1)

         {                

                   if(result[0]=='0'&&result.size()!=1)

                            result.erase (result.begin (),result.begin ()+1);           

                   else break;

         }

         return result;

  }


除法:
string high_div(string a,int b)  //获得a/b的结果,类似整除,但是是用字符实现

{

     string result;

     int temp = a[0] - '0';

     int s = 1;

go_on:

     while(temp<b&&s<a.size())

     {

         temp = temp*10 + a[s++] - '0';

         if(temp<b&&s<a.size())

              result += '0';

     }

     result += temp/b + '0';

     temp = temp%b;

     if(s <a.size())

         goto go_on;

     else    

     {

         while(result[0] == '0'&&result.size()>1)

              result.erase(result.begin());

     }

     return result;

}

模除   :
int high_mod(string a,int b)

{

     string result;

     int temp = a[0] - '0';

    int s = 1;

go_on:

     while(temp<b&&s<a.size())

     {

         temp = temp*10 + a[s++] - '0';

         if(temp<b&&s<a.size())

              result += '0';

     }

     result += temp/b + '0';

     temp = temp%b;

     if(s <a.size())

         goto go_on;

     else

         return temp;

}

阶乘:
string high_n(int m)

{

          int n  = m;

                   string sum = "1";

                   for(int i = n;i>=2;i--)

                   {

                            string temp = int_to_str(i);  //调用转换函数

                            sum = high_mut(sum,temp);//高精度乘法

                   }

                   return sum;

}

进制转换:
string base_m(int n,int m)//把n转换为m(m<=36)进制数,最大数用Z表示

{

     string temp;     //保存n的进制数

     string temp2;

    int x = 0;

     while(n >= m)

     {   

         x = n%m;

         n = n/m;

         temp2 += '0'+x;

         if(temp2[0] > '9')

              temp2[0] = 'A'+x-10;

         temp.insert(0,temp2);

         temp2.clear();

     }

     temp2 += '0'+n;

     if(temp2[0] > '9')    

         temp2[0] = 'A'+n-10;

     temp.insert(0,temp2);

     return temp;

}

 

原文地址:http://mcs.sysu.edu.cn/user/longt/Article_902

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值