高精度模板汇总
这是旧的汇总。
一、高精度加法
二、高精度减法
三、高精度乘法
四、高精度除法
五、总
用 struct 数组模拟。
比较实用。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int r;
struct bignum{
char s[N];
int a[N],len;
bool flag;
bignum(){
memset(a,0,sizeof a);
len = 1;
flag = 0;
}
bignum(int x){
while(x){
a[len] = x % 10;
x /= 10;
len ++;
}
len --;
}
int &operator [] (int i){
return a[i];
}
friend bool operator < (bignum a,bignum b){
if(a.len < b.len) return true;
if(a.len > b.len) return false;
for(int i = a.len;i >= 1;i --){
if(a[i] < b[i]) return true;
if(a[i] > b[i]) return false;
}
return false;
}
friend bool operator > (bignum a,bignum b){
if(a.len < b.len) return false;
if(a.len > b.len) return true;
for(int i = a.len;i >= 1;i --){
if(a[i] < b[i]) return false;
if(a[i] > b[i]) return true;
}
return true;
}
friend bool operator == (bignum a,bignum b){
if(a.len != b.len) return false;
for(int i = a.len;i >= 1;i --){
if(a[i] != b[i]) return false;
}
return true;
}
void input(){
scanf("%s",s + 1);
len = strlen(s + 1);
for(int i = 1;i <= len;i ++) a[i] = s[len - i + 1] - '0';
}
void print(){
if(flag) printf("-");
for(int i = len;i >= 1;i --) printf("%d",a[i]);
}
};
bignum operator + (bignum a,bignum b){
bignum c;
c.len = max(a.len,b.len);
long long t = 0;
for(int i = 1;i <= c.len;i ++){
t += a[i] + b[i];
c[i] = t % 10;
t /= 10;
}
if(t){
c.len ++;
c[c.len] = 1;
}
return c;
}
bignum operator - (bignum a,bignum b){
bignum c;
if(a < b){
c.flag = 1;
swap(a,b);
}
int t = 0;
c.len = 0;
for(int i = 1;i <= a.len;i ++){
t = a[i] - t;
if(i <= b.len) t -= b[i];
c[++ c.len] = (t + 10) % 10;
if(t < 0) t = 1;
else t = 0;
}
while(c[c.len] == 0 && c.len > 1) c.len --;
return c;
}
bignum operator * (bignum a,bignum b){
bignum c;
int t = 0;
for(int i = 1;i <= a.len;i ++){
for(int j = 1;j <= b.len;j ++){
c[i + j - 1] += a[i] * b[j];
c.len = max(c.len,i + j);
}
}
for(int i = 1;i <= c.len || t;i ++){
if(i <= c.len) t += c[i];
c[i] = t % 10;
t /= 10;
}
while(c[c.len] == 0 && c.len > 1) c.len --;
return c;
}
bignum operator / (bignum a,int b){
bignum c;
for(int i = a.len;i >= 1;i --){
r = r * 10 + a[i];
c[++ c.len] = r / b;
r %= b;
}
reverse(c.a + 1, c.a + c.len + 1);
while(c.len > 1 && c[c.len] == 0) c.len --;
return c;
}
tql
QwQ
┌┬┐┌╯┐╭┐ ┐ ┌──┴─┐╭─┐╭─┐
││││─│┌┐┌─┼┐ │ │ ┌┼─┐
││││─┘┌┘│ ││ ├────┘┌┬┐│ │
├┼┤└─┐│├├─┼┤ │┌───┐ │ │ │
└┼╯└─│ │└─┼╯ ││ │┌╯╮│ │
└ └─╯╰┘ ╯ ,╯└───╯└─┘╯└╯
In function ‘bignum operator*(bignum, bignum)’:
error: ‘c’ was not declared in this scope
c[i + j - 1] += a[i] * b[j];
^
‘c’ was not declared in this scope
for (int i = 1; i <= c.len || t; i ++) {
| ^
error: ‘c’ was not declared in this scope
while(c[c.len] == 0 && c.len > 1) c.len –;
| ^
error: ‘c’ was not declared in this scope
return c;
| ^
In function ‘bignum operator/(bignum, int)’:
error: ‘r’ was not declared in this scope
r = r * 10 + a[i];
看看我的吧https://www.acwing.com/blog/content/37099/
哦哦已修改。
我放错代码了....(我真聪明
害
你这r还是没声明