結果
| 問題 |
No.8062 A + B
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2020-04-01 22:32:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 6,154 bytes |
| コンパイル時間 | 1,452 ms |
| コンパイル使用メモリ | 111,812 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-27 11:45:58 |
| 合計ジャッジ時間 | 2,036 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 |
コンパイルメッセージ
main.cpp: In member function 'BigInt BigInt::operator*=(const BigInt&)':
main.cpp:196:3: warning: no return statement in function returning non-void [-Wreturn-type]
196 | }
| ^
ソースコード
//author:luckYrat(twitter:@luckYrat_)
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <map>
#include <bitset>
#include <cctype>
#include <utility>
#include <climits>
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
const int mod = 1000000007;
const int inf = (1<<30)-1;
const ll linf = (1LL<<62LL)-1;
const double EPS = (1e-10);
#define anyfill(n,s) setw(n) << setfill(s)
#define loop(s) for(int i = 0; s > i; i++)
#define rep(i,q) for(int i = 0; (q) > i; i++)
#define repp(i,n,q) for(int i = n; (q) > i; i++)
#define dep(i,q) for(int i = (q); 0 < i; i--)
#define pb push_back
#define fir first
#define scn second
#define ednl endl
#define YesNo(a) (a?"Yes":"No")
#define YESNO(a) (a?"YES":"NO")
#define yesno(a) (a?"yes":"no")
P ar4[4] = {{0,1},{0,-1},{1,0},{-1,0}};
P ar8[8] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
//S
struct BigInt{
string val;
BigInt():val("0"){}
BigInt(string s){
if(s == "0"){
val = "0";
return;
}
bool firstdigit = false;
for(int i = 0; s.size() > i; i++){
if('0' <= s[i] && s[i] <= '9'){
if(!firstdigit && s[i] == '0')continue;
firstdigit = true;
val.push_back(s[i]);
}else if(s[i] == '-' && val.empty()){
val.push_back(s[i]);
}else{
val = "0";
break;
}
}
}
BigInt abs(BigInt p){
if(p.val[0] == '-'){
p.val = p.val.substr(1,p.val.size()-1);
}
return p;
}
BigInt SignTurn(BigInt p){
if(p.val[0] == '-'){
p.val = p.val.substr(1,p.val.size()-1);
}else{
p.val = "-" + p.val;
}
return p;
}
BigInt max(BigInt a,BigInt b){
if(a.val.size() > b.val.size()){
return a;
}else if(a.val.size() < b.val.size()){
return b;
}else{
for(int i = 0; a.val.size()> i; i++){
if(a.val[i] > b.val[i]){
return a;
}
if(a.val[i] < b.val[i]){
return b;
}
}
}
return a;
}
BigInt operator+=(const BigInt &p){
BigInt z = *this;
BigInt k = p;
if(z.val[0] == '-' && p.val[0] == '-'){
return SignTurn(abs(z)+abs(k));//(-123)+(-124) -> -((123)+(124))
}else if(z.val[0] == '-'){
return k-abs(z);//(-123)+(124) -> (124)-(123)
}else if(p.val[0] == '-'){
return (z)-abs(k);//(123)+(-124) -> (123)-(124)
}else{
//123 + 1234
bool Mvup = false;
string ret = "";
if(z.val.size() < k.val.size()){
swap(z,k);
}
//val.size() > k.val.size();
for(int i = z.val.size()-1; 0 <= i; i--){
if(z.val.size()-k.val.size() > i){
//val[i]+Mvup
ret.push_back(((z.val[i]-'0'+(Mvup?1:0))%10)+'0');
Mvup = ((z.val[i]-'0'+(Mvup?1:0))>=10);
}else{
//val[i],k.val[i-(val.size()-k.val.size())]+Mvup
ret.push_back(((z.val[i]-'0'+k.val[i-(z.val.size()-k.val.size())]-'0'+(Mvup?1:0))%10)+'0');
Mvup = ((z.val[i]-'0'+k.val[i-(z.val.size()-k.val.size())]-'0'+(Mvup?1:0)) >= 10);
}
}
if(Mvup)ret.push_back('1');
reverse(ret.begin(),ret.end());
if(ret.empty())ret.push_back('0');
z.val = ret;
}
return z;
}
BigInt operator-=(const BigInt &p){
BigInt z = *this;
BigInt k = p;
if(z.val[0] == '-' && k.val[0] == '-'){
return (z)+abs(k);//(-123)-(-123) -> (-123)+(123)
}else if(z.val[0] == '-'){
return (z)+SignTurn(k);//(-123)-(123) -> (-123)+(-123)
}else if(k.val[0] == '-'){
return abs(k)+(z);//(123)-(-123) -> (123)+(123)
}else{
string ret = "";
//z >= k
bool Mvdwn = false;
bool minus = false;
if(max((z),k) != z){
minus = true;
swap(z,k);
}
for(int i = z.val.size()-1; 0 <= i; i--){
if(z.val.size() - k.val.size() > i){
if(z.val[i]-'0' < (Mvdwn?1:0)){
ret.push_back(10+z.val[i]-(Mvdwn?1:0));
Mvdwn = true;
}else{
ret.push_back(z.val[i]-(Mvdwn?1:0));
Mvdwn = false;
}
}else{
if(z.val[i] < k.val[i-(z.val.size()-k.val.size())]+(Mvdwn?1:0)){
ret.push_back(10+z.val[i]-(k.val[i-(z.val.size()-k.val.size())]+(Mvdwn?1:0)) + '0');
Mvdwn = true;
}else{
ret.push_back(z.val[i]- (k.val[i-(z.val.size()-k.val.size())]+(Mvdwn?1:0)) + '0');
Mvdwn = false;
}
}
}
while(ret[ret.size()-1] == '0' && ret.size() > 1)ret.pop_back();
if(minus)ret.push_back('-');
if(ret.empty())ret.push_back('0');
reverse(ret.begin(),ret.end());
z.val = ret;
}
return z;
}
BigInt operator*=(const BigInt &p){
BigInt z = *this;
BigInt k = p;
bool hugo = false;
if((z.val[0] == '-') + (p.val[0] == '-') == 1)hugo = true;
z = abs(z);k = abs(k);
}
BigInt operator+(const BigInt &p){return (*this) += p;}
BigInt operator-(const BigInt &p){return (*this) -= p;}
bool operator==(const BigInt &p){return val == p.val;}
bool operator!=(const BigInt &p){return val != p.val;}
friend ostream &operator<<(ostream &os, const BigInt &p){
return os << p.val;
}
friend istream &operator>>(istream &is, BigInt &p){
string s;
cin>>s;
p = BigInt(s);
return (is);
}
};
using bigint = BigInt;
//E
char mp[1000][1000];
struct z{
int x,y,p;
};
__attribute__((constructor))
void initial() {
cin.tie(0);
ios::sync_with_stdio(false);
}
int main(){
string a,b;cin>>a>>b;
string c = a+b;
string d = "";
string e = "";
bool f = false;
bool z = false;
vector<bigint> A;
vector<char> B;
for(int i = 0; c.size() > i; i++){
if(c[i]=='+' || c[i]=='-'){
if(d.empty())A.push_back((bigint)"0");
else A.push_back(d);
B.push_back(c[i]);
d = "";
}else{
d.push_back(c[i]);
}
}
A.push_back(d);
bigint Z = A[0];
for(int i = 0; B.size() > i; i++){
if(B[i]=='+'){
Z=Z+A[i+1];
}else{
Z=Z-A[i+1];
}
}
cout << Z << endl;
}