在洛谷上看到的关于大数加减乘除的算法,[原算法地址](https://www.luogu.com.cn/blog/user28954/solution-p1601)
自己稍做了一些改动之后,贴在这里,希望更多人看到,总的思路就是模拟手算
1.string 的erase以及find_first_not_of(),swap的用法
2.字符串随意拼接的用法
#include<bits/stdc++.h>
using namespace std
;
void moveFrontZero(string
&a
)
{
a
.erase(0,a
.find_first_not_of('0'));
if(a
.empty())a
="0";
}
void align(string
&a
,string
&b
)
{
int a_size
=a
.size();
int b_size
=b
.size();
if(a_size
<b_size
)
{
for(int i
=1;i
<=b_size
-a_size
;i
++)
{
a
="0"+a
;
}
}
else
{
for(int i
=1;i
<=a_size
-b_size
;i
++)
{
b
="0"+b
;
}
}
}
string
add(string a
,string b
)
{
moveFrontZero(a
);
moveFrontZero(b
);
string answer
="";
align(a
,b
);
int temp
=0,jw
=0;
for(int i
=a
.size()-1;i
>=0;i
--)
{
temp
=a
[i
]-'0'+b
[i
]-'0'+jw
;
jw
=temp
/10;
temp
%=10;
answer
=(char)(temp
+'0')+answer
;
}
if(jw
)answer
=(char)(jw
+'0')+answer
;
moveFrontZero(answer
);
return answer
;
}
string
sub(string a
,string b
)
{
moveFrontZero(a
);
moveFrontZero(b
);
align(a
,b
);
bool is_minus
=false;
if(a
<b
)
{
is_minus
=true;
a
.swap(b
);
}
string answer
="";
int temp
=0,jw
=0;
for(int i
=a
.size()-1;i
>=0;i
--)
{
if(a
[i
]<b
[i
]+jw
)
{
temp
=a
[i
]+10-b
[i
]-jw
;
jw
=1;
answer
=(char)(temp
+'0')+answer
;
}else
{
temp
=a
[i
]-b
[i
]-jw
;
jw
=0;
answer
=(char)(temp
+'0')+answer
;
}
}
moveFrontZero(answer
);
if(is_minus
)answer
="-"+answer
;
return answer
;
}
string
mul(string a
,string b
)
{
moveFrontZero(a
);
moveFrontZero(b
);
string answer
="";
for(int i
=a
.size()-1;i
>=0;i
--)
{
string temp
="";
for(int j
=1;j
<=a
.size()-1-i
;j
++)
{
temp
+="0";
}
int s
=0,jw
=0;
for(int j
=b
.size()-1;j
>=0;j
--)
{
s
=(a
[i
]-'0')*(b
[j
]-'0')+jw
;
jw
=s
/10;
s
%=10;
temp
=(char)(s
+'0')+temp
;
}
if(jw
)temp
=(char)(jw
+'0')+temp
;
answer
=add(answer
,temp
);
}
moveFrontZero(answer
);
return answer
;
}
string
div(string a
,string b
)
{
moveFrontZero(a
);
moveFrontZero(b
);
string answer
="";
string reminder
="";
reminder
.append(a
,0,b
.size()-1);
for(int i
=b
.size()-1;i
<a
.size();i
++)
{
reminder
=reminder
+a
[i
];
moveFrontZero(reminder
);
for(char j
='9';j
>='0';j
--)
{
string temp
="";
temp
=temp
+j
;
temp
=mul(b
,temp
);
align(temp
,reminder
);
if(temp
<=reminder
)
{
answer
=answer
+j
;
reminder
=sub(reminder
,temp
);
break;
}
}
}
moveFrontZero(answer
);
cout
<<"reminder="<<reminder
<<endl
;
return answer
;
}
int main()
{
string a
,b
;
cin
>>a
>>b
;
cout
<<sub(a
,b
)<<endl
;
cout
<<add(a
,b
)<<endl
;
cout
<<mul(a
,b
)<<endl
;
cout
<<div(a
,b
)<<endl
;
return 0;
}
转载请注明原文地址: https://lol.8miu.com/read-30869.html