題解 UVA10013 【Super long sums】
阿新 • • 發佈:2020-08-29
實際發表時間:2020-05-06
https://www.luogu.com.cn/problem/UVA10013
看見題解沒有\(\texttt{壓位高精+過載運算子}\),趕緊水一發
做法
- Step1:輸入資料組數\(t\)
- Step2:每一次輸入長度\(s\),然後輸入\(s\)行的兩個字元,再用字串拼接
- Step3:\(\text{高精加法}\)
- Step4:
沙比地按格式輸出
程式碼
其他事項都在程式碼裡了
#include<bits/stdc++.h> using namespace std; struct BigNum//大整數結構體 { static const int BASE=100000000;//10^壓位數 static const int WIDTH=8;//我壓8位 vector<int>s;//用它來儲存 BigNum operator=(const string &str)//賦值 { s.clear(); int x,len=(str.size()-1)/WIDTH+1;//8位8位賦值 for (int i=0;i<len;i++) { int end=str.size()-i*WIDTH; int start=max(0,end-WIDTH); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } BigNum operator+(const BigNum &b) const//加法 { BigNum c;//存結果 c.s.clear(); for (unsigned i=0,g=0;;i++)//8位8位加 { if (g==0&&i>=s.size()&&i>=b.s.size())break; int x=g; if (i<s.size())x+=s[i]; if (i<b.s.size())x+=b.s[i]; c.s.push_back(x%BASE);//壓位 g=x/BASE; } return c; } BigNum operator-(BigNum b) const//減法,此題用不到 { if (*this<b)return b-*this;//如果被減數小於減數 BigNum c;//結果 c.s.clear(); for (unsigned i=0;i<b.s.size();i++)b.s[i]=-b.s[i]; c=*this+b;//a-b=a+(-b) c.s.push_back(0);//怕結果只有一位補個0 for (unsigned i=0;i<c.s.size()-1;i++) if(c.s[i]<0) { c.s[i]+=BASE;//壓位! c.s[i + 1]--; } while(!c.s[c.s.size()-1])c.s.pop_back(); return c; } bool operator<(const BigNum &b) const//小於 { if (s.size()!=b.s.size())return s.size()<b.s.size(); for (int i=s.size()-1;i>=0;i--)if(s[i]!=b.s[i])return s[i]<b.s[i]; return false; } bool operator>(const BigNum &b) const//大於 { return b<*this; } }A,B; ostream &operator<<(ostream &out,const BigNum x)//輸出流,注意不要引用&,不然沒法cout<<A+B { out<<x.s.back(); for(int i=x.s.size()-2;i>=0;i--) { char buf[20]; sprintf(buf,"%08d",x.s[i]); for(unsigned j=0;j<strlen(buf);j++)out << buf[j]; } return out; } istream &operator>>(istream &in,BigNum &x)//輸入流,一定要引用,要賦值的 { string s; if(!(in>>s))return in; x=s; return in; } int t,s; string a,b; char x,y; int main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//加速cincout cin>>t;//Step1 while(t--) { cin>>s;//Step2 a=b="";//記得先清空 while(s--) { cin>>x>>y; a+=x,b+=y; } A=a,B=b; cout<<A+B<<endl;//Step3 if(t>0)cout<<endl;//Step4 } return 0; }