知识总结
java大数 导入java.math.BigInteger类,然后就是BigInteger的常用函数了
多敲就能熟练,常用的不多,加减乘除取模吧
思路来源
https://www.cnblogs.com/superxuezhazha/p/4761854.html
常用用法
1.valueOf(parament); 将参数转换为制定的类型
比如 int a=3;
BigInteger b=BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;
2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);
3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate(); 取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.public int compareTo();
14.boolean equals(); 是否相等
15.BigInteger构造函数:
BigInteger a,b;
a=a.add(b);
a=a.substract(b);
a=a.multiply(b);
a=a.divied(b);
a=a.gcd(b);
板子整理
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner (new BufferedInputStream(System.in));
PrintWriter cout=new PrintWriter(System.out);
BigInteger a,b,c,d;
a=cin.nextBigInteger();
b=cin.nextBigInteger();
c=cin.nextBigInteger();
d=cin.nextBigInteger();
if(a.compareTo(b)<0)//此时由于a<b,则返回值小于0;
{
System.out.println("a<b");
}
if(b.equals(c))//此时由于b==c,则返回值等于0;
{
System.out.println("b==c");
}
if(d.compareTo(c)>0)//此时由于d>c,则返回值大于0;
{
System.out.println("d>c");
}
int t;
t=cin.nextInt();
int eg=1;
while(t>0)
{
BigInteger eight=new BigInteger("8");
BigInteger seven=new BigInteger("7");
BigInteger one=new BigInteger("1");
String inp;
inp=cin.next();
BigInteger n=new BigInteger(inp);
BigInteger ans;
BigInteger ans2;
ans=n.multiply(n).multiply(eight);
ans2=n.multiply(seven);
ans=ans.subtract(ans2);
ans=ans.add(one);
cout.println("Case #"+eg+": "+ans);
++eg;
--t;
}
cout.flush();
}
}
C++大数
牛客多校,借鉴了国防科技大学队伍的板子,万分感谢
/*#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<cstring>
#include<algorithm>*/
typedef long long ll;
typedef unsigned long long ull;
const double PI = 4.0*atan(1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
const int BASE = 1000000000;
const int BASEDIGITS = 9;
using namespace std;
struct bint
{
vector<int> s;
char sign;
bint(): s(), sign(1) {}
bint(const ll &v): s(), sign(v < 0 ? -1 : 1)
{
for (ll t = v < 0 ? -v : v; t; t /= BASE)
{
s.push_back(t % BASE);
}
}
bint(const string &v): s(), sign(1)
{
int beg = 0;
for (; beg < (int)v.size() && (v[beg] == '-' || v[beg] == '+'); beg++)
{
if (v[beg] == '-')
{
sign = -1;
}
}
for (int i = (int)v.size() - 1, x, j; i >= beg; i -= BASEDIGITS)
{
for (x = 0, j = max(beg, i - BASEDIGITS + 1); j <= i; x = x * 10 + v[j++] - '0');
s.push_back(x);
}
trim();
}
bint &operator=(const bint &v)
{
sign = v.sign;
s = v.s;
return *this;
}
bint &operator+=(const bint &v)
{
if (sign == v.sign)
{
for (int i = 0, is = 0, len = max(s.size(), v.s.size()); i < len || is; i++)
{
if (i == (int)s.size())
{
s.push_back(0);
}
s[i] += is + (i < (int)v.s.size() ? v.s[i] : 0);
if ((is = s[i] >= BASE))
{
s[i] -= BASE;
}
}
return *this;
}
else
{
return *this -= -v;
}
}
bint &operator-=(const bint &v)
{
if (sign == v.sign)
{
if (cmp(v, 0) != -1)
{
for (int i = 0, is = 0; i < (int)v.s.size() || is; i++)
{
s[i] -= is + (i < (int)v.s.size() ? v.s[i] : 0);
if ((is = s[i] < 0))
{
s[i] += BASE;
}
}
trim();
return *this;
}
else
{
return *this = -(bint(v) -= *this);
}
}
else
{
return *this += -v;
}
}
bint &operator*=(const bint &v)
{
vector<ll> num(s.size() + v.s.size());
for (int i = 0; i < (int)s.size(); i++)
{
for (int j = 0; j < (int)v.s.size(); j++)
{
num[i + j] += (ll)s[i] * v.s[j];
if (num[i + j] >= BASE)
{
num[i + j + 1] += num[i + j] / BASE;
num[i + j] %= BASE;
}
}
}
sign *= v.sign;
s.resize(num.size());
for (int i = 0; i < (int)num.size(); i++)
{
s[i] = num[i];
}
trim();
return *this;
}
bint &operator/=(const bint &v)
{
return *this = divmod(*this, v).first;
}
bint &operator%=(const bint &v)
{
return *this = divmod(*this, v).second;
}
bint operator-()const
{
bint ret(*this);
ret.sign = -sign;
return ret;
}
bint operator+(const bint &v)const
{
return bint(*this) += v;
}
bint operator-(const bint &v)const
{
return bint(*this) -= v;
}
bint operator*(const bint &v)const
{
return bint(*this) *= v;
}
bint operator/(const bint &v)const
{
return divmod(*this, v).first;
}
bint operator%(const bint &v)const
{
return divmod(*this, v).second;
}
bint operator^(const ll &v)const
{
bint ret(1), t(*this);
for (ll b = v; b; b >>= 1)
{
if (b & 1)
{
ret *= t;
}
t *= t;
}
return ret;
}
friend pair<bint, bint> divmod(const bint &a, const bint &b)
{
int norm = BASE / (b.s.back() + 1);
bint x = a.abs().mul(norm), y = b.abs().mul(norm), q, r;
q.s.resize(x.s.size());
for (int i = (int)x.s.size() - 1; i >= 0; i--)
{
r = r.mul(BASE);
r += x.s[i];
int s1 = r.s.size() <= y.s.size() ? 0 : r.s[y.s.size()];
int s2 = r.s.size() + 1 <= y.s.size() ? 0 : r.s[y.s.size() - 1];
int d = ((ll)BASE * s1 + s2) / y.s.back();
r -= y.mul(d);
while (r.cmp(0, 1) == -1)
{
r += y;
--d;
}
q.s[i] = d;
}
q.sign = a.sign * b.sign;
q.trim();
r.sign = a.sign;
r.trim();
return make_pair(q, r.div(norm));
}
bint mul(int v)const
{
bint ret(*this);
if (v < 0)
{
ret.sign = -ret.sign;
v = -v;
}
for (int i = 0, is = 0; i < (int)ret.s.size() || is; i++)
{
if (i == (int)s.size())
{
ret.s.push_back(0);
}
ll a = ret.s[i] * (ll)v + is;
is = a / BASE;
ret.s[i] = a % BASE;
}
ret.trim();
return ret;
}
bint div(int v)const
{
bint ret(*this);
if (v < 0)
{
ret.sign = -ret.sign;
v = -v;
}
for (int i = (int)ret.s.size() - 1, rem = 0; i >= 0; i--)
{
ll a = ret.s[i] + rem * (ll)BASE;
ret.s[i] = a / v;
rem = a % v;
}
ret.trim();
return ret;
}
int mod(int v)const
{
if (v < 0)
{
v = -v;
}
int m = 0;
for (int i = (int)s.size() - 1; i >= 0; i--)
{
m = (s[i] + m * (ll)BASE) % v;
}
return m * sign;
}
bool operator<(const bint &v)const
{
return cmp(v) < 0;
}
bool operator>(const bint &v)const
{
return cmp(v) > 0;
}
bool operator<=(const bint &v)const
{
return cmp(v) <= 0;
}
bool operator>=(const bint &v)const
{
return cmp(v) >= 0;
}
bool operator==(const bint &v)const
{
return cmp(v) == 0;
}
bool operator!=(const bint &v)const
{
return cmp(v) != 0;
}
int cmp(const bint &v, bool is = 1)const
{
if (is)
{
if (sign > v.sign)
{
return 1;
}
if (sign < v.sign)
{
return -1;
}
}
int d = sign > 0 || !is ? 1 : -1;
if (s.size() > v.s.size())
{
return d;
}
if (s.size() < v.s.size())
{
return -d;
}
for (int i = (int)s.size() - 1; i >= 0; i--)
{
if (s[i] > v.s[i])
{
return d;
}
if (s[i] < v.s[i])
{
return -d;
}
}
return 0;
}
bint abs()const
{
bint ret(*this);
ret.sign *= ret.sign;
return ret;
}
void trim()
{
while (!s.empty() && !s.back())
{
s.pop_back();
}
if (s.empty())
{
sign = 1;
}
}
void print()const
{
if (sign == -1)
{
putchar('-');
}
printf("%d", s.empty() ? 0 : s.back());
for (int i = (int)s.size() - 2; i >= 0; i--)
{
printf("%09d", s[i]);
}
}
friend istream &operator>>(istream &in, bint &v)
{
string s;
in >> s;
v = s;
return in;
}
string toString()const
{
if (s.empty())
{
return "0";
}
string ret, x;
if (sign == -1)
{
ret += '-';
}
for (int o = s[s.size() - 1]; o; o /= 10)
{
x += o % 10 + '0';
}
for (int i = (int)x.size() - 1; i >= 0; i--)
{
ret += x[i];
}
for (int i = (int)s.size() - 2; i >= 0; i--)
{
x.clear();
for (int j = 0, p = s[i]; j < BASEDIGITS; j++, p /= 10)
{
x += p % 10 + '0';
}
for (int j = BASEDIGITS - 1; j >= 0; j--)
{
ret += x[j];
}
}
return ret;
}
operator bool()const
{
return s.size() && !(s.size() == 1 && !s[0]);
}
bint sqrt()const
{
bint ret, t(*this);
ret.s.resize((t.s.size() + 1) >> 1);
for (int i = (int)ret.s.size() - 1; i >= 0; i--)
{
int l = 0, r = BASE - 1, mid = ret.s[i] = (l + r + 1) >> 1;
while (l < r)
{
if (comp(ret, mid, i - 1, t))
{
r = mid - 1;
}
else
{
l = mid;
}
mid = ret.s[i] = (l + r + 1) >> 1;
}
sub(t, ret, mid, i - 1);
ret.s[i] += mid;
}
for (int i = 0; i < (int)ret.s.size(); i++)
{
ret.s[i] >>= 1;
}
ret.trim();
return ret;
}
void sub(bint &a, const bint &b, const int &k, const int &d)const
{
for (int i = d + 1, l = b.s.size() + d; i <= l; i++)
{
ll tmp = a.s[i] - (ll)b.s[i - d - 1] * k;
if (tmp < 0)
{
a.s[i + 1] += (tmp - BASE + 1) / BASE;
a.s[i] = tmp - (tmp - BASE + 1) / BASE * BASE;
}
else
{
a.s[i] = tmp;
}
}
for (int i = b.s.size() + d + 1; i < (int)a.s.size() && a.s[i] < 0; i++)
{
a.s[i + 1] += (a.s[i] - BASE + 1) / BASE;
a.s[i] -= (a.s[i] - BASE + 1) / BASE * BASE;
}
a.trim();
}
bool comp(const bint &a, const int &c, const int &d, const bint &b)const
{
int l = -(BASE << 1);
ll t = 0;
if (b.s.size() < a.s.size() + d && c)
{
return true;
}
for (int i = (int)b.s.size() - 1; i > d; i--)
{
t = t * BASE + (ll)(i - d - 1 < (int)a.s.size() ? a.s[i - d - 1] : 0) * c - b.s[i];
if (t > 0)
{
return true;
}
if (t < l)
{
return false;
}
}
for (int i = d - 1; i >= 0; i--)
{
t = t * BASE - b.s[i];
if (t > 0)
{
return true;
}
if (t < l)
{
return false;
}
}
return t > 0;
}
};
Python3大数
python3的整数,是不限长度的类型
所以python3里的代码,默认大数