高精度封装大礼包
struct bign{
int d[50], len;
void clean() { while(len > 1 && !d[len-1]) len--; }
bign() { memset(d, 0, sizeof(d)); len = 1; }
bign(int num) { *this = num; }
bign(char* num) { *this = num; }
bign operator = (const char* num){
memset(d, 0, sizeof(d)); len = strlen(num);
for(int i = 0; i < len; i++) d[i] = num[len-1-i] - '0';
clean();
return *this;
}
bign operator = (int num){
char s[20]; sprintf(s, "%d", num);
*this = s;
return *this;
}
bign operator + (const bign& b){
bign c = *this; int i;
for (i = 0; i < b.len; i++){
c.d[i] += b.d[i];
if (c.d[i] > 9) c.d[i]%=10, c.d[i+1]++;
}
while (c.d[i] > 9) c.d[i++]%=10, c.d[i]++;
c.len = max(len, b.len);
if (c.d[i] && c.len <= i) c.len = i+1;
return c;
}
bign operator - (const bign& b){
bign c = *this; int i;
for (i = 0; i < b.len; i++){
c.d[i] -= b.d[i];
if (c.d[i] < 0) c.d[i]+=10, c.d[i+1]--;
}
while (c.d[i] < 0) c.d[i++]+=10, c.d[i]--;
c.clean();
return c;
}
bign operator * (const bign& b)const{
int i, j; bign c; c.len = len + b.len;
for(j = 0; j < b.len; j++) for(i = 0; i < len; i++)
c.d[i+j] += d[i] * b.d[j];
for(i = 0; i < c.len-1; i++)
c.d[i+1] += c.d[i]/10, c.d[i] %= 10;
c.clean();
return c;
}
bign operator / (const bign& b){
int i, j;
bign c = *this, a = 0;
for (i = len - 1; i >= 0; i--)
{
a = a*10 + d[i];
for (j = 0; j < 10; j++) if (a < b*(j+1)) break;
c.d[i] = j;
a = a - b*j;
}
c.clean();
return c;
}
bign operator % (const bign& b){
int i, j;
bign a = 0;
for (i = len - 1; i >= 0; i--)
{
a = a*10 + d[i];
for (j = 0; j < 10; j++) if (a < b*(j+1)) break;
a = a - b*j;
}
return a;
}
bign operator += (const bign& b){
*this = *this + b;
return *this;
}
bool operator <(const bign& b) const{
if(len != b.len) return len < b.len;
for(int i = len-1; i >= 0; i--)
if(d[i] != b.d[i]) return d[i] < b.d[i];
return false;
}
bool operator >(const bign& b) const{return b < *this;}
bool operator<=(const bign& b) const{return !(b < *this);}
bool operator>=(const bign& b) const{return !(*this < b);}
bool operator!=(const bign& b) const{return b < *this || *this < b;}
bool operator==(const bign& b) const{return !(b < *this) && !(b > *this);}
string str() const{
char s[maxn]={};
for(int i = 0; i < len; i++) s[len-1-i] = d[i]+'0';
return s;
}
};
istream& operator >> (istream& in, bign& x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream& out, const bign& x)
{
out << x.str();
return out;
}加
string add(string a,string b){
if(a.size() > b.size()) swap(a,b);
b.insert(b.begin(),'0');
int t = 0;
for(int i = b.size()-1,j = a.size()-1;i>=0;i--,j--){
int cur;
if(j>=0) cur = (a[j]-'0') + (b[i]-'0') + t;
else cur = (b[i] - '0') +t;
b[i] = (cur%10) + '0';
t = cur/10;
}
int idx = b.find_first_not_of('0');
return idx != -1? b.substr(idx): "0";
}减
string sub(string a,string b){
//a大b小
int t = 0;
for(int i = a.size()-1,j = b.size()-1;i>=0;i--,j--){
int up = 0,down = 0;
up = (a[i]-'0') + t; t = 0;
if(j>=0) down = (b[j]-'0');
if(up < down) up+=10,t = -1;
int cur = up-down;
a[i] = cur+'0';
}
int idx = a.find_first_not_of('0');
return idx != -1? a.substr(idx) : "0";
}乘(高精度*低精度)
string mul(string a,ll b){
string c = "";
ll t = 0;
for(int i = a.size()-1;i>=0 || t;i--){
if(i>=0) t += (a[i]-'0')*b;
c += (t%10) +'0';
t/=10;
}
reverse(c.begin(),c.end());
return c;
}除(高精度/低精度)
返回商的整数部分
string div(string a,ll b){
string c = "";
ll cur = 0;
for(int i = 0;i<a.size();i++){
cur = cur*10 + (a[i]-'0');
c += to_string(cur/b);
cur %= b;
}
int idx = c.find_first_not_of('0');
return idx!=-1 ? c.substr(idx) : "0";
}比较大小
bool cmp(string a,string b){
int idx1 = a.find_first_not_of('0'),idx2 = b.find_first_not_of('0');
a = idx1!=-1? a.substr(idx1) : "0";
b = idx2!=-1? b.substr(idx2) : "0";
if(a.size() != b.size()) return a.size() >= b.size();
return a>=b;
}所有
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll maxn = 1e6+10;
double eps = 1e-8;
bool cmp(string a,string b){
int idx1 = a.find_first_not_of('0'),idx2 = b.find_first_not_of('0');
a = idx1!=-1? a.substr(idx1) : "0";
b = idx2!=-1? b.substr(idx2) : "0";
if(a.size() != b.size()) return a.size() >= b.size();
return a>=b;
}
string add(string a,string b){
if(a.size() > b.size()) swap(a,b);
b.insert(b.begin(),'0');
int t = 0;
for(int i = b.size()-1,j = a.size()-1;i>=0;i--,j--){
int cur;
if(j>=0) cur = (a[j]-'0') + (b[i]-'0') + t;
else cur = (b[i] - '0') +t;
b[i] = (cur%10) + '0';
t = cur/10;
}
int idx = b.find_first_not_of('0');
return idx != -1? b.substr(idx): "0";
}
string sub(string a,string b){
//a大b小
int t = 0;
for(int i = a.size()-1,j = b.size()-1;i>=0;i--,j--){
int up = 0,down = 0;
up = (a[i]-'0') + t; t = 0;
if(j>=0) down = (b[j]-'0');
if(up < down) up+=10,t = -1;
int cur = up-down;
a[i] = cur+'0';
}
int idx = a.find_first_not_of('0');
return idx != -1? a.substr(idx) : "0";
}
string mul(string a,ll b){
string c = "";
ll t = 0;
for(int i = a.size()-1;i>=0 || t;i--){
if(i>=0) t += (a[i]-'0')*b;
c += (t%10) +'0';
t/=10;
}
reverse(c.begin(),c.end());
return c;
}
string divbb(string a,string b,int len){
//未验证
string c = "";int tag = 1;
for(int i = 1;i<=len;i++){
int cnt = 0;
while(cmp(a,b)){
cnt++;
a = sub(a,b);
}
c += to_string(cnt);
if(tag) c+='.';tag = 0;
a += '0';
}
return c;
}
string div(string a,ll b){
string c = "";
ll cur = 0;
for(int i = 0;i<a.size();i++){
cur = cur*10 + (a[i]-'0');
c += to_string(cur/b);
cur %= b;
}
int idx = c.find_first_not_of('0');
return idx!=-1 ? c.substr(idx) : "0";
}
int main(){
string a;ll b;
cin>>a>>b;
cout<<mul(a,b)<<endl;
return 0;
}
京公网安备 11010502036488号