charとintを行ったり来たり

投稿者: | 2017年11月22日

今回の問題はこちらです。


実装方法は・・・力技です。ARCぐらいになると、四則演算を用いて~になるんでしょうが、今回は+か-なので、優先順位はないのでゴリ押し戦法OKです。
つまりは、”8個if分書けばいい”という回答が通ります。
私が書いた頭の悪いコードは次のとおりです。

[cpp]
    #include <iostream>
    #include <string>
    using namespace std;
    int main(int argc, char const *argv[]) {
      string s;
      cin>>s;
      int a[4];
      for(int i=0;i<4;i++){
        a[i]=s[i]-'0';
      }
      if((a[0]+a[1]+a[2]+a[3])==7){
        cout<<a[0]<<"+"<<a[1]<<"+"<<a[2]<<"+"<<a[3]<<"=7"<<endl;
      }else if((a[0]+a[1]+a[2]-a[3])==7){
        cout<<a[0]<<"+"<<a[1]<<"+"<<a[2]<<"-"<<a[3]<<"=7"<<endl;
      }else if((a[0]+a[1]-a[2]+a[3])==7){
        cout<<a[0]<<"+"<<a[1]<<"-"<<a[2]<<"+"<<a[3]<<"=7"<<endl;
      }else if((a[0]+a[1]-a[2]-a[3])==7){
        cout<<a[0]<<"+"<<a[1]<<"-"<<a[2]<<"-"<<a[3]<<"=7"<<endl;
      }else if((a[0]-a[1]+a[2]+a[3])==7){
        cout<<a[0]<<"-"<<a[1]<<"+"<<a[2]<<"+"<<a[3]<<"=7"<<endl;
      }else if((a[0]-a[1]+a[2]-a[3])==7){
        cout<<a[0]<<"-"<<a[1]<<"+"<<a[2]<<"-"<<a[3]<<"=7"<<endl;
      }else if((a[0]-a[1]-a[2]+a[3])==7){
        cout<<a[0]<<"-"<<a[1]<<"-"<<a[2]<<"+"<<a[3]<<"=7"<<endl;
      }else if((a[0]-a[1]-a[2]-a[3])==7){
        cout<<a[0]<<"-"<<a[1]<<"-"<<a[2]<<"-"<<a[3]<<"=7"<<endl;
      }
      return 0;
    }
[/cpp]

なんつーか・・・「やればできる!」っていう感じです。if分コピペしてたら、超近視の私は死にかけました。
こんなバカみたいなコード書きたくなければ、3重ループ書いてください。今回は+と-なので、-を-1を掛けると考えれば終わります。
さて、今回の問題はこんなやればできる問題ではなく、9行目のcharをint型に変換しているところです。
アスキーコード表見たら理由はわかると思うので、備忘録としては、どうやってcharとint行き来するかだけ書きます。

・int→char

(int)a=(char)moji+’0′;

・char→int

(char)moju=(int)-‘0’;
アセンブリ言語でも似たことやりましたし、ksnctfでもやりました・・・。なんと物覚えの悪い頭なんだろうか・・・。
char型を指定された数だけ進める問題もありますので、よろしければどうぞ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください