整數》字串(高精度常用):
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(sresult = 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()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,演算法有待改進
vectorx; //轉換到vector中
vectory;
int n = a.size();
x.assign(n,0);
int m = b.size();
y.assign(m,0);
for(int i = 0;ix[i] = a[i]-'0';
for(int i = 0;iy[i] = b[i]-'0';
vectorr;
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(temptemp = temp*10 + a[s++] - '0';
if(tempresult += '0';
result += temp/b + '0';
temp = temp%b;
if(s 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(temptemp = temp*10 + a[s++] - '0';
if(tempresult += '0';
result += temp/b + '0';
temp = temp%b;
if(s 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;
高精度運算總結
日期 2022年5月18日 資料型別 定義識別符號 資料範圍 整型int 231 231 1 2 109 長整型long long 263 263 1 無符號長整型 unsigned long long 0 264 1 上面給出的範圍的數稱為單精度數,對應的運算稱為單精度運算。超出上面給出的範圍的數...
高精度除法(高精度除以高精度)
先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...
高精度除高精度
演算法流程 第一步,讀入被除數 a 和 除數 b,判斷是否 a b,是則輸出 0 並結束演算法,否則令 answer 0 第二步,令餘數 remainder 0,令 i 從被除數最高位的下標開始 第三步,令 remainder remainder 10 a i 令 c 9 第四步,判斷是否 b c ...