整数>>字符串(高精度常用):
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;
}