此题目特征为储存数字超过long long类型,c++无法用一个变量存储全部数字
解法为开数组来储存各个位上的数字
1.字符高精度
直接以两种方式处理字符即可
#include<bits/stdc++.h> using namespace std; char a[1000000]; int main(void) { int n=0,t1=0,t2=0; //输入 while(cin>>a[n]) { if(a[n]=='E')break; n++; } //计算11分制 for(int i=0;i<n;i++) { if(a[i]=='W')t1++; else if(a[i]=='L')t2++; if((t1>=11||t2>=11)&&(t1-t2>=2||t2-t1>=2)) { cout<<t1<<":"<<t2; cout<<endl; t1=0;t2=0; } } //计算21分制 if(t1!=0||t2!=0)cout<<t1<<":"<<t2<<endl; cout<<endl; t1=0;t2=0; for(int i=0;i<n;i++) { if(a[i]=='W')t1++; else if(a[i]=='L')t2++; if((t1>=21||t2>=21)&&(t1-t2>=2||t2-t1>=2)) { cout<<t1<<":"<<t2; cout<<endl; t1=0;t2=0; } } if(t1!=0||t2!=0)cout<<t1<<":"<<t2; return 0; }
2.高精度加法
开两个数组后各位相加再进位即可
#include<bits/stdc++.h> using namespace std; int main(void) { int n1=0,n2=0,n,a[105]={0},b[105]={0},c[105]={0},in; char win1[105]={'a'},win2[105]={'a'}; cin>>win1; for(int i=100,j=0;i>=0;i--) { if(win1[i]>=48&&win1[i]<=57) { a[j]=win1[i]-48; n1++; j++; } } cin>>win2; for(int i=100,j=0;i>=0;i--) { if(win2[i]>=48&&win2[i]<=57) { b[j]=win2[i]-48; n2++; j++; } } if(n1>n2)n=n1; else n=n2; for(int i=0;i<=n+1;i++) { c[i]=a[i]+b[i]; if(c[i]>=10) { a[i+1]++; c[i]-=10; } } int start=0; for(int i=n;i>=0;i--) { if(c[i]!=0) { cout<<c[i]; start=1; continue; } else if(start==0&&c[i]==0) { start=1; continue; } cout<<c[i]; } cout<<endl; return 0; }
3.高精度乘法
该题虽然为累加,但考虑到减少计算量,直接用高斯求和公式
关键为两高精度的乘积如何计算
据观察可知,乘法可一这样计算
即一个高精度的每一位与另一高精度的每一位相乘后存储在一个新的高精度中,最后进位
#include<bits/stdc++.h> using namespace std; char win[105]; int main(void) { int n=0,a[105]={0},c[205]={0}; cin>>win; //逆序输入 for(int i=100,j=0;i>=0;i--) { if(win[i]>=48&&win[i]<=57) { a[j]=win[i]-48; n++; j++; } } //得平方 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c[j+i]+=a[i]*a[j];; } } //得到n(n+1) for(int i=0;i<n;i++) { c[i]+=a[i]; } //除2 for(int i=2*n-2;i>=1;i--) { c[i-1]+=c[i]%2*10; c[i]-=(c[i]%2); c[i]/=2; } if(c[0]%2==1)c[0]=(c[0]+1)/2; else c[0]/=2; //进位 for(int i=0;i<2*n-1;i++) { if(c[i]>10)c[i+1]+=c[i]/10; c[i]=c[i]%10; } //输出c int start=0; if(win[0]=='0')cout<<"0"; else { for(int i=200;i>=0;i--) { if(c[i]!=0) { start=i; break; } } for(;start>=0;start--) { cout<<c[start]; } } return 0; }
标签:cout,高精度,int,题解,t2,--,模拟,105 From: https://www.cnblogs.com/if-I-can-fly/p/16879207.html