日刊競プロ ABC 229 -B Hard Calculation-
問題文
正整数 A,B が与えられます。
A+B を(十進法で)計算する時、繰り上がりが生じないなら Easy 、生じるなら Hard と出力してください。
制約
A,B は整数
1≤A,B≤10**18
考えたこと
繰り上がり=各桁を足して10以上であるときなので、各桁に分解しそれぞれの桁の和が10以上であればその場で解を出すような形にする。AとBの桁数が違う場合を考慮し、AとBの1の桁から和をとるようにし、AとBのうち桁数が小さいものの桁数の数だけチェックを行うようにする。
例 56 +153であれば、56の方が桁数が小さいため最低2回チェックを行えば良い。
1回目 56の6と153の3の和 =9
2回目 56の5と153の5の和 =10 繰り上がり有りのため終了というようにする
回答
A,B = map(str,input().split())
A=A[::-1]
B=B[::-1]
minsize = min(len(A),len(B))
for i in range(minsize):
if int(A[i])+int(B[i])>=10:
print ("Hard")
quit()
print ("Easy")
公式回答
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b;
cin >> a >> b;
while(a>0 && b>0){
if((a%10)+(b%10)>=10){cout << "Hard\n";return 0;}
a/=10;b/=10;
}
cout << "Easy\n";
}
1.A を 10 で割った余りと B を 10 で割った余りの和を求める。これが 10 以上であれば、繰り上がりが発生するので Hard と出力して終了する。
2.A,B それぞれを 10 で割る。(小数点以下は切り捨てる。)
3.1,2 の操作を続け、A,B どちらかが 0 になっても繰り上がりが検出されなければ、繰り上がりは発生しないので Easy と出力して終了する。
あとがき
1の桁から順に計算していくところで、単純に配列を逆順にしていましたが、10で割った余りを使い、1桁ずつ計算するという方法があるのですね。。。