高精度之高精度加减法

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数组中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值