C++ 该死的高精度加减法
没看书直接硬上的结果是,一个简单的高精度减法我用了一个多小时只写了一个90分的代码。之前准备NOIP的时候确实是学了,可惜现在早就还给老师了。
结果回家一看标准程序,顿时有种想哭的赶脚。
先上我的90分代码:
//高精度减法
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
string a,b;
int dif,dns=0;
vector<int>c;
void change(string x,string y)
{
dif=abs(x.size()-y.size());
// cout<<dif;
int len=max(x.size(),y.size());
// cout<<len;
for(int i=len-1;i>=0;i--)
{
// cout<<"orz";
int a=x[i]-'0'+dns,b=y[i-dif]-'0';
if(len-i > y.size()) {
// cout<<"$$$$$$$$$$$$$$$$";
b=0;
}
int p=a-b;
// if(i==0) cout<<a<<endl<<b<<"orz";
// cout<<a<<'\t'<<p<<'\t';
dns=0;
if (p < 0) {
if(i==0 && dif==0 ) {
cout<<'-';
dns=0;
c.resize(0);
change(y,x);
return;
}
p+=10;
dns=-1;
}
// printf("%d____________\n",p);
// cout<<p<<'/';
c.push_back(p);
}
// cout<<"|||||||||||||||"<<endl;;
if(dif==1&&x[0]=='0') return;
// cout<<c.size()<<endl;
}
int main()
{
cin>>a>>b;
if (a.length() < b.length() ) {
cout<<'-';
change(b,a);
}
else
{
change(a,b);
}
// cout<<c.size();
for(int i=c.size()-1;i>=0;i--)
{
// cout<<"orz"<<i<<endl;
cout<<c[i];
}
return 0;
}
里面充斥着大量d_bug的语句,见证着我的血与泪。这个代码错误的地方就在于我选择了string也就是字符串,这样的话比较大小上会很复杂,但是如果用char数组的话就没有这么麻烦了,直接用strcmp就可以搞定,可是苦逼的我当时就是没想到(咳咳!!好吧,其实我是想用string装逼来着)。
下面是用char写的代码:
***************麻蛋上次写到这里忘了保存,还得重新写。
参考了标程,突然发现了上面程序的缺点,就是当两个数相等时,会输出0000000000000,但是只要加上下面一句话:
if(a == b) {
cout<<’0’;
return 0;
}
妥妥的AC!!!!
所以我终于意识到了一个问题:string可以比较大小!!!!我终于吃着屎写出了一个完美的代码。。。
代码如下:
//高精度减法
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
string a,b;
int dif,len1,dns=0,len2;
vector<int>c;
void change(string x,string y)
{
dif=abs(x.size()-y.size());
int len=max(x.size(),y.size());
for(int i=len-1;i>=0;i--)
{
int a=x[i]-'0'+dns,b=y[i-dif]-'0';
if(len-i > y.size()) {
b=0;
}
int p=a-b;
dns=0;
if (p < 0) {
p+=10;
dns=-1;
}
c.push_back(p);
}
}
int main()
{
cin>>a>>b;
len1=a.size();
len2=b.size();
if(a == b) {
cout<<'0';
return 0;
}
if ( a.length() < b.length()||(len1==len2 && a<b )) {
cout<<'-';
change(b,a);
}
else if(len1>len2||(len1==len2 && a>b ))
{
change(a,b);
}
// cout<<c.size();
int con=1;
for(int i=c.size()-1;i>=0;i--)
{
// cout<<"orz"<<i<<endl;
if(c[i]==0&&con)continue;
con=0;
cout<<c[i];
}
return 0;
}
包含着血与泪的胜利//
这里不得不提一下string的比较规则,比较时并不涉及长度,从第一位开始,按照字典序比较,如果a是b的子串,那么b>a。
至于高精度加法,比减法简单很多,代码贴在下面:
//高精度加法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
string a,b;
int len1,len2,len,lenn,dif,dns=0;
vector<int>qaq;
void change(string x,string y)
{
for(int i=len-1;i>=0;i--) {
int m=x[i]-'0'+dns,n=y[i-dif]-'0';
if(len-i > y.size() ) n=0;
int p=m+n;
dns=0;
if(p>=10) {
p-=10;
dns=1;
}
qaq.push_back(p);
}
if(dns)qaq.push_back(dns);
}
int main()
{
cin>>a>>b;
len1=a.size();
len2=b.size();
len=max(len1,len2);
dif=abs(len1-len2);
if(len1 >= len2) change (a,b);
else change (b,a);
int con=1,qq=0;
for (int i=qaq.size()-1;i>=0;i--) {
if(con==1&&qaq[i]==0) continue;
con=0;
cout<<qaq[i];
qq++;
}
if(!qq) cout<<'0';
return 0;
}
好吧,我又一次栽在了0这一个点上还有就是注意最后的进位可能需要单独放进vector数组中。