問題
解いてみた
ソースを見てみます。
ちょっと長いのでキモとなる部分を抜粋します。
まずはflagを表示する処理のところ。
ソースを見る限り
if(account_balance > 100000){
を満たせばflagが表示されそうです。
account_balanceについて確認してみます。
定義段階では1100が入っています。
42行目でaccount_balanceの値を書き換える処理があるのでここをどうにか頑張る問題のようです。
account_balance = account_balance - total_cost;
の計算後account_balanceが100000より大きな値になればいいので
1100 - total_cost > 100000
total_cost < - 98900
となるようにtotal_costがなればよいわけです。
total_costはどこで書き換えられているのでしょうか。
ほぼさっきと同じところで処理されているだけのようです。
int total_cost = 0;
total_cost = 900*number_flags;
number_flagsは36行目で入力した数値が入ります。
ということでnumber_flagsに大きめのマイナスの値を入力したらよさそうですが、37行目で>0があるので正数である必要があります。
たしかintの仕組みを考えると最大値を超えると桁あふれがおきて最小値に行ってしまうはずです。
∵一番上のけたは符号を判断するための桁なので、桁あふれで1になって1はマイナスを示すから。
intの最大値について調べます。
データ型の最大値の確認 - Qiita
https://qiita.com/hryshtk/items/b848ed3bd78f940ac5af
最大値は2147483647とのこと。
試しにこの最大値を入力してどうなるか確認してみます。
-900になりました。方針はこれであってそうです。
今やりたいことはtotal_cost < - 98900を満たしたい。
そのためには
-98900 > 900*number_flags
-109 > number_flags
となるようなnumber_flagsにする。
2147483647+100=2147483747を設定すれば良いんでしょうか。
と思ったらなんかバグって駄目でした。
ちょっと混乱してきました。
逆に引くのか?
2147483647-100=2147483547でやってみます。
おお、引くのが正解みたい。
2147483647-1000=2147482647とかやればゴールできるか。
できた。