Day 7高精度问题

一、高精度加法
(一)思路:红色的1 2 3 是重点。

1.输入输出
在这里插入图片描述
2.关系
在这里插入图片描述

(二)我的代码
#include <iostream>
#include <cstring>
using namespace std;

const int N=100000;
int main(){
    char str1[N+10],str2[N+10];
    int a[N+10],b[N+10],c[N+15],t[N+10]={0};
    int len1,len2,len_m,len3;
    
    scanf("%s",str1);
    scanf("%s",str2);
    len1=strlen(str1);
    len2=strlen(str2);
    len_m=max(len1,len2);
    len3=len_m;
    
    for(int i=1;i<=len1;i++){
        int j=len1-i;
        a[i]=str1[j]-'0';
     }
    for(int i=1;i<=len2;i++){
        int j=len2-i;
        b[i]=str2[j]-'0';
     }
     
    for(int i=1;i<=len_m;i++){
        c[i]=a[i]+b[i]+t[i-1];
        if(i<len_m){
            if(c[i]>=10){
                c[i]-=10;
                t[i]=1;
            }
        } 
        else{
            if(c[i]>=10){
                c[i]-=10;
                c[i+1]=1;
                len3++;
            }
        }
   }
    for(int i=len3;i>=1;i--) 
        cout<<c[i];
        
    return 0;
}
   
(三)yxc的模板代码
#include <iostream>
#include <vector>

using namespace std;

vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);//保证大数是操作数1

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b;
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');

    auto C = add(A, B);

    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    cout << endl;

    return 0;
}

学习到的:

1.用到了STL

1).STL使字符串的定义,输入(读入)更简便

string a, b;
cin>>a>>b;

2).vector:cplusplus

  • 声明:vector<int> A;注意vector与之间无空格!后面的变量名或者函数名是有空格的。
  • a.size();
    在这里插入图片描述
  • A.push_back(a[i] - '0'); a.push_back(100);
    在这里插入图片描述

3).auto C = add(A, B);我们发现add函数返回值是一个int型的vector。
返回值不一定是一个数,可以返回类型。
4).auto CppReference
是让编译器自己推断类型是什么,这里相当于写 vector

2.我的代码t作为进位,单独村里个数组,模板中,t是一个临时的值“”除10取余存入C数组,除10的值作为作为下次进位”,减少了空间。
好绕!!!

二、高精度减法

(一)我的代码
1.借鉴上面的yxc的代码,尝试使用了STL写。
报了几次错,进行了修改。报错改正的部分写在了注释里面,下一次写代码时,要注意。

#include <iostream>
#include <vector>

using namespace std;

vector<int> jian(vector<int> &A,vector<int> &B);//取地址符号没有写导致error

int main(){
    string a,b;
    cin>>a>>b;
    vector<int> A,B;
    for(int i=a.size()-1;i>=0;i++)  A.push_back(a[i]-'0');//push_back中间的下划线没有写导致error
    for(int i=b.size()-1;i>=0;i++)  B.push_back(b[i]-'0');
    int f=1;
    if(B.size()>A.size()) f=0;
    else  if (B.size()==A.size()){
         for(int i=A.size()-1;i>=0;i--)
             if(A[i]<B[i]) f=0;
    }
    if(f==1){//f==1时A数租对应的数字值大于B
        auto C=jian(A,B);
        for(int i=C.size()-1;i>=0;i--)
            cout<<C[i];
    }
    else {
        auto C=jian(B,A);//保证函数中的第一操作数是值大的数对应的数组
        for(int i=C.size()-1;i>=0;i--)
            cout<<-C[i];
    }
    return 0;
}
vector<int> jian(vector<int> &A,vector<int> &B){
    int t=0;
    vector<int> C;
    for(int i=0;i<=A.size()-1;i++){//传入时已经保证操作数1的数组对应着更大的数
        if(B.size()-1<i)    B.push_back(0);//B很可能比A短,因此加上这一句
        C[i]=A[i]-B[i]-t;
        if(C[i]<0){
            C[i]+=10;
            t=1;
        }
    }
    return C;
 }

2.运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值