目录
大家还好吗?我又双叒叕来写高精度了!
乘法的竖式
其实我调过两兆次的,都失败了
第一次
算第a位,一定是第位字符串长度
于是我便开始干,结果……算出来不知道啥东西
………………
第二次
其实就是竖式的算法,但有一个地方和搞错了
12
33
————
36
36
————
396
于是………………
………………
正确的一次
其实我知道其实是的倍
正解是也就是的倍
那多出来的一千是哪儿来的
原来,我这块写错了
经过修改
整个模板长这个样(其他也有修改的,可以看一看)
#include<bits/stdc++.h>
using namespace std;
namespace high_pre{
typedef string high_pre_num;
void minus_zero(high_pre_num &a){
bool s=0;
if(a[a.size()-1]=='-'){
s=1;
a.pop_back();
}
while(a.size()>1&&a[a.size()-1]=='0')
a.pop_back();
if(s){
if(a=="0")
return;
else
a+='-';
}
}
high_pre_num input(){//输入
high_pre_num a="";
cin>>a;
reverse(a.begin(),a.end());
minus_zero(a);
return a;
}
high_pre_num init(string x){//定义(等于a=……)
high_pre_num a="";
reverse(x.begin(),x.end());
minus_zero(x);
a=x;
return a;
}
void output(high_pre_num a){//输出
minus_zero(a);
reverse(a.begin(),a.end());
cout<<a;
}
bool greater(high_pre_num a,high_pre_num b){//大于
if(a[a.size()-1]!='-'&&b[b.size()-1]!='-'){
if(a.size()>b.size())
return true;
if(a.size()<b.size())
return false;
else{
for(int i=0;i<a.size();i++)
if(a[i]>b[i]) return true;
return false;
}
}
else if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
if(a.size()>b.size())
return true;
if(a.size()<b.size())
return false;
else{
for(int i=1;i<a.size();i++){
if(a[i]>b[i]) return true;
if(a[i]<b[i]) return false;
}
return false;
}
}
else if(a[a.size()-1]=='-'&&b[b.size()-1]!='-')
return false;
else
return true;
}
bool less(high_pre_num a,high_pre_num b){//小于
return greater(b,a);
}
bool equals(high_pre_num a,high_pre_num b){//等于
if(greater(a,b))
return false;
else if(less(a,b))
return false;
return true;
}
high_pre_num minus(high_pre_num a){//等于平时我们用的-a(a为一个变量)
if(a[a.size()-1]=='-')
a.pop_back();
else
a+='-';
return a;
}
bool is_minus(high_pre_num a){
return (a[a.size()-1]=='-');
}
high_pre_num add(high_pre_num a,high_pre_num b){//加法
high_pre_num s="";
if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){
a.pop_back();
swap(a,b);
bool k=0;
if(less(a,b))
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){
b.pop_back();
bool k=0;
if(less(a,b))
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
bool k=0;
if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
b.pop_back();
a.pop_back();
k=1;
}
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<=lll;i++){
b+='0';
a+='0';
l=a[i]-'0'+b[i]-'0'+x;
if(l==0&&i==lll)<%
break;
%>
x=0;
if(l>=10){
x+=l/10;
l%=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
high_pre_num sub(high_pre_num a,high_pre_num b){//减法
if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){//被减数是负数时
a.pop_back();
return add(a,b)+'-';
}
if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){//减数是负数时
b.pop_back();
return add(a,b);
}
bool nnn=0;
if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){//两个都是负数时
b.pop_back();
a.pop_back();
nnn=1;
}
bool k=0;
if(less(a,b))//是负数
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)//特判
s+='-';
if(nnn)//特判
s=minus(s);
return s;
}
int hpntoi(high_pre_num a){//转化为int(有个前提,不爆int)
minus_zero(a);
reverse(a.begin(),a.end());
return stoi(a);
}
long long hpntoll(high_pre_num a){//转化为long long(有个前提,不爆long long)
minus_zero(a);
reverse(a.begin(),a.end());
return stoll(a);
}
long hpntol(high_pre_num a){//转化为long(有个前提,不爆long)
minus_zero(a);
reverse(a.begin(),a.end());
return stol(a);
}
high_pre_num mult(high_pre_num a,high_pre_num b){//乘法
if(is_minus(a)&&is_minus(b)){
a.pop_back();
b.pop_back();
}
bool k=0;
if(is_minus(a)&&(!is_minus(b))){
k=1;
a.pop_back();
}
if(is_minus(b)&&(!is_minus(a))){
k=1;
b.pop_back();
}
high_pre_num s="";
int x=0,l=0;
int xxx=b.size();
b+='0';
for(int i=0;i<a.size();i++){
high_pre_num ll="";
for(int j=1;j<=i;j++)
ll+='0';
x=0;
for(int j=0;j<=xxx;j++){
l=(a[i]-'0')*(b[j]-'0')+x;
if(l>9){
x=l/10;
l%=10;
}
ll+=(l+'0');
}
s=add(s,ll);
}
if(k)
s+='-';
return s;
}
}