4 条题解

  • 2
    @ 2022-12-24 15:47:05
    #include<bits/stdc++.h>//万能头文件
    using namespace std;//没有这个,不识别cin和cout
    string s1,s2;//字符串定义
    int l1,l2,l,i,a[10005],b[10005],c[10005];
    int main()
    {
        cin>>s1>>s2;//输入
        l1=s1.length();//获取s1的字符串长度
        for(i=0;i<l1;i++) a[l1-i]=s1[i]-48;//减48是因为char比int值大48 
        l2=s2.length();//获取s2的字符串长度
        for(i=0;i<l2;i++) b[l2-i]=s2[i]-48;//同上
        l=l1<l2?l2:l1;//←三目运算
        for(i=1;i<=l;i++)
         {
            c[i]=a[i]+b[i]+c[i];
            c[i+1]=c[i]/10;//进位,将前一位得到的整数乘10累加到后一位
            c[i]=c[i]%10;//重新整理c数组
        }
        if(c[l+1]>0) l++;//判断
        for(i=l;i>=1;i--) cout<<c[i];//输出
        return 0;
    }
    

    史上最长AC代码(不嫌麻烦的可以来一波)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int pow(int a,int b){//简单较慢的快速幂,但是很简单
        if(b==0)//递归边界之一:a^0=1(暂且不考虑a=0)
            return 1;
        if(b==1)//递归边界之二:a^1=a
            return a;
        if(b==2)//递归边界之三:a^2=a*a
            return a*a;
        if(b%2==0)//快速幂的核心递归部分:当2|b时,a^b=(a^(b/2))^2
            return pow(pow(a,b/2),2);
        else//递归部分:当b%2=1时,a^b=a^(b-1)*a
            return pow(a,b-1)*a;
    }
    struct integer{
        short i[126];//四位一压,所以共有126*4=504位,不会爆
        bool pn;//我还考虑了符号......
        integer( ){//构造函数初始化
            int j;
            pn=false;
            for(j=0;j<126;j++)
                i[j]=0;
        }//这个应该都看得懂吧......
        void read( ){//成员函数负责读入
            int j,k,m=0,n=0;
            char ii[504]={0};
            bool zero=true;
            scanf("%s",ii);//读入
            if(ii[0]=='-')//正负处理
                pn=true;
            else
                pn=false;
            for(j=503;j>-1;j--)//处理绝对值
                if(ii[j]>0){//找到个位
                    for(k=j;k>-1;k--)
                        if(ii[k]>='0' && ii[k]<='9'){
                            n++;
                            i[m]+=pow(10,n-1)*(ii[k]-'0');//这一步最难懂,慢慢琢磨,想一想怎么往高插入
                            if(n==4){//四位一压,别过界
                                n=0;
                                m++;
                            }
                        }
                    break;
                }
            for(j=0;j<126;j++)//分清楚0和-0是一码事(没办法我考虑了符号)
                if(i[j]>0)
                    zero=false;
            if(zero)
                pn=false;
            return;
        }
        void write( ){//成员函数负责输出(总感觉像Pascal)
            int j,k,a,b,c,d;
            bool zero=true;
            for(j=0;j<126;j++)//分清楚0和-0是一码事
                if(i[j]>0)
                    zero=false;
            if(zero)
                pn=false;
            if(pn)//负号
                putchar('-');
            for(j=125;j>-1;j--)//找到最高位
                if(i[j]>0){
                    cout<<i[j];//省略前导0
                    for(k=j-1;k>-1;k--){//一定注意这里不能省略前导0!!!这也是为什么四位一压麻烦的原因之一
                        a=i[k]/1000;
                        b=i[k]/100%10;
                        c=i[k]/10%10;
                        d=i[k]%10;
                        putchar(a+'0');
                        putchar(b+'0');
                        putchar(c+'0');
                        putchar(d+'0');
                    }
                    return;
                }
            putchar('0');//如果自始至终都是0(不进循环,即本数为0),输出0
            return;
        }
        integer operator=(const int a){//把int型转化成integer自定义型
            int b,j,k;
            bool zero=true;
            b=a;//注意a是const类型,不可改变!
            if(a<0){//对负数的处理
                b=-b;
                pn=true;
            }
            else
                pn=false;
            for(j=0;j<126;j++){//想一想,为什么是10000不是10
                i[j]=b%10000;
                b/=10000;
                if(b==0){
                    for(k=j+1;k<126;k++)
                        i[k]=0;
                    break;
                }
            }
            for(j=0;j<126;j++)//还是那句话,分清楚0和-0是一码事
                if(i[j]>0)
                    zero=false;
            if(zero)
                pn=false;
            return *this;
        }
        integer(int a){//重载运算符里最难懂的部分,注意一定要有这个(只要你有对赋值语句的重载最好都加上)
            *this=a;
        }
        integer operator+(const integer &a){//对加号的重载
            integer b;
            int j;
            bool zero=true;
            if(*this==0)//0加任何数,仍得这个数
                return a;
            else if(a==0)
                return *this;
            if(pn==a.pn){//同号两数相加,取相同的符号,并把绝对值相加
                b.pn=pn;
                for(j=0;j<125;j++){
                    b.i[j]+=i[j]+a.i[j];
                    b.i[j+1]+=b.i[j]/10000;//还是那个问题,想想为什么是10000不是10
                    b.i[j]=b.i[j]%10000;
                }
                b.i[125]+=i[125]+a.i[125];//专防数组越界(即访问无效内存)
                b.i[j]=b.i[j]%10000;
                for(j=0;j<126;j++)//不多说了,你懂的
                    if(b.i[j]>0)
                        zero=false;
                if(zero)
                    b.pn=false;
                return b;
            }
            else{//异号两数相加,取绝对值较大数的符号,并把绝对值相减
                int tw=0;
                integer x,y;
                x.pn=false;
                y.pn=false;
                for(j=0;j<126;j++){
                    x.i[j]=i[j];
                    y.i[j]=a.i[j];
                }
                if(x>y){//判断哪个数的绝对值大
                    b.pn=pn;
                    for(j=0;j<126;j++){
                        b.i[j]=i[j]-a.i[j]-tw;
                        tw=0;
                        if(b.i[j]<0){
                            b.i[j]+=10000;
                            tw++;
                        }
                    }
                    for(j=0;j<126;j++)
                        if(b.i[j]>0)
                            zero=false;
                    if(zero)
                        b.pn=false;
                    return b;
                }
                else if(x<y){
                    b.pn=a.pn;
                    for(j=0;j<126;j++){
                        b.i[j]=a.i[j]-i[j]-tw;
                        tw=0;
                        if(b.i[j]<0){
                            b.i[j]+=10000;
                            tw++;
                        }
                    }
                    for(j=0;j<126;j++)
                        if(b.i[j]>0)
                            zero=false;
                    if(zero)
                        b.pn=false;
                    return b;
                }
                else{//互为相反数的两个数和为0
                    b=0;
                    for(j=0;j<126;j++)
                        if(i[j]>0)
                            zero=false;
                    if(zero)
                        pn=false;
                    return b;
                }
            }
        }
            bool operator>(const integer &a)const{//判断大小
            int j;
            if(pn && (!a.pn))//负数小于正数
                return false;
            else if((!pn) && a.pn)//正数大于负数
                return true;
            else if(pn){//两个负数比较,绝对值大的反而小
                for(j=125;j>-1;j--){
                    if(i[j]<a.i[j])
                        return true;
                    else if(i[j]>a.i[j])
                        return false;
                }
                return false;
            }
            else{//两个正数比较,绝对值大的就大
                for(j=125;j>-1;j--){
                    if(i[j]>a.i[j])
                        return true;
                    else if(i[j]<a.i[j])
                        return false;
                }
                return false;//相等返回false
            }
        }
        bool operator<(const integer &a)const{//小于即大于的完全相反
            return a>(*this);
        }
        bool operator==(const integer &a)const{//等于即既不大于又不小于
            return !(*this>a || *this<a);
        }
        bool operator>=(const integer &a)const{//大于等于即不小于
            return !(*this<a);
        }
        bool operator<=(const integer &a)const{//小于等于即不大于
            return !(*this>a);
        }
        bool operator!=(const integer &a)const{//不等于就是不等于嘛
            return !(*this==a);
        }
    };
    int main( ){
        integer a,b,c;//剩下的简单易懂
        a.read( );
        b.read( );
        c=a+b;
        c.write( );
        return 0;
    }
    
    • @ 2023-2-8 12:10:44

      ……

    • @ 2023-2-8 12:14:12

      他真的,我哭死,他甚至还将那么长的代码贴心地加了注释

    • @ 2023-7-14 20:14:23

      吾本欲以长篇大论赞之叹之,而今日为时已晚,只送一字:6 我其实是在一本正经地胡说八道

    • @ 2024-6-7 23:08:35

      哥,你真的不累吗 作业写完没👀️

  • 0
    @ 2023-10-8 22:08:52
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=250;
    char sa[maxn],sb[maxn];
    int a[maxn],b[maxn],c[maxn];
    int main(){
    	cin>>sa;
    	cin>>sb;
    	memset(c,0,sizeof(c));
    	int len=strlen(sa);
    	int len1=strlen(sb);
    	for (int i=0;i<len;i++){
    		a[len-i-1]=sa[i]-'0';
    	}
    	for (int i=0;i<len1;i++){
    		b[len1-i-1]=sb[i]-'0';
    	}//倒序 方便 并将其转成数字数组 
    	int len2=len>len1?len:len1;
    	for (int i=0;i<len2;i++){
    		c[i]+=a[i]+b[i];
    		c[i+1]=c[i]/10;
    		c[i]=c[i]%10;
    	}//c数组计算两个数字之和以及进位 
    	if (c[len2]>0){
    		len2++;
    	}
    	int cnt=len2-1;
    	while(c[cnt]==0){
    		cnt--;
    	}//去除前导0 
    	for (int i=cnt;i>=0;i--){
    		cout<<c[i];
    	}//倒序输出 
    	return 0;
    }//高精加
    
    • 0
      @ 2023-8-11 10:23:18

      全网首发,全网最短 print(int(input()) + int(input()))

      • @ 2023-10-30 21:17:25

        用python写高精=作弊()

    • 0
      @ 2022-12-4 16:18:09

      python自带高精:

      a=int(input())
      b=int(input())
      print(a+b)
      

      C++模拟大脑计算

      #include<bits/stdc++.h>
      using namespace std;
      int x,y;
      int i,j;
      char ab[100001],bc[100001];
      int a[100001],b[100001];
      int jw;
      int maxn,maxj;
      int main( )
      {
      cin>>ab>>bc;
      x=strlen(ab);
      y=strlen(bc);
      for(i=0;i<x;i++)
      a[i]=ab[x-i-1]-'0';
      for(i=0;i<y;i++)
      b[i]=bc[y-i-1]-'0';
      maxn=max(x,y);
      for(i=0;i<maxn;i++)
      {
      a[i]=a[i]+b[i]+jw;
      jw=a[i]/10;
      a[i]%=10;
      }
      if(jw==1) cout<<jw;
      for(i=maxn-1;i>=0;i--)
      {
      cout<<a[i];
      }
      return 0;
      }
      
      • 1

      信息

      ID
      267
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      递交数
      380
      已通过
      106
      上传者