4 条题解
-
2
#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; }
-
0
#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
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
- 上传者