白駿アルゴリズム1864号:タコ数字


質問リンク


https://www.acmicpc.net/problem/1864

制限



質問する


長い間、海流が遅く、底生生物が少ない海底でしか発見されなかった波紋の正体は、海洋学者たちの謎だった.しかし、最近の研究成果は動物言語学分野の革命を引き起こした.海洋生物学者は、この模様の正体がタコが数字を書く方法であることを発見した.学者たちはタコが何を数えているのかまだ知らないが、数表法の解読に成功した.
陸上に暮らす人々にとって、タコが使う数字とその波紋を表現する図案はよく知られていない.そのため、研究者たちは以下の記号で波紋を記録することに同意した.各記号に対応する数字は次のとおりです.
  • -0に対応します.
  • は1に対応します.
  • (2.
  • に対応)
  • @は3に対応しています.
  • ?4に対応します.
  • '>'は5に対応します.
  • &は6に対応します.
  • %は7に対応する.
  • /対応-1.
    海洋神経学者たちは特に興奮して飲料水の嗜好を発見し、まだスタート段階にある頭足類神経学がこの発見をきっかけに成長することを期待している.
  • もちろん、タコの水系は8進法に基づいています.例:
    (@&は2× 82 + 3 × 8+6=158.
    ?/--を選択).× 83 + −1 × 82 + 0 × 8+0=1984.
    \× 82 + 2 × 8+1=47です.
    あなたに質問するのはタコの数字を入力して、10進数で表します.

    入力


    各行にタコの数字を入力します.各数字は少なくとも1つ、最大8つのタコ数字記号から構成されている.「#」を入力すると、入力を終了します.

    しゅつりょく


    各行に入力されたタコの数字に対応する10進数を出力します.

    入力と出力の例



    に答える


  • 平方と文字列の長さを繰り返し計算する必要があるので、math.hヘッダファイルとstring.hファイルが追加されました.

  • 入力文字列を受け入れ、入力文字列の長さをlengthに格納します.

  • switch-case文を使用して、lengthなどの各文字の値を判断します.

  • 値が何であるかが分かったらpow(複数回二乗関数)にexpo変数を乗じ、ここでは8進法と呼ぶのでpow(8,length-1)です.

  • 次の文字列にジャンプするには、lengthから1を減算し、iは1を増やします.

  • 結果を出力!
  • プールコード

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define size 9
    
    char arr[size];
    
    int main(){
      while(scanf("%s",arr) != '#'){
        if(arr[0] == '#'){
          break;
        }
        int length = strlen(arr);
        int i = 0,result = 0,expo;
        while(length != 0){
          char str = arr[i];
          switch(str){
            case '-':
              expo = 0;
              break;
            case '\\':
              expo = 1;
              break;
            case '(':
              expo = 2;
              break;
            case '@':
              expo = 3;
              break;
            case '?':
              expo = 4;
              break;
            case '>':
              expo = 5;
              break;
            case '&':
              expo = 6;
              break;
            case '%':
              expo = 7;
              break;
            case '/':
              expo = -1;
              break;
          }
          result += expo*pow(8,length -1);
          length--;
          i++;
        }
      printf("%d\n",result);
      }
      return 0;
    } 

    ふくガス


    初めてメールを見た時は長すぎたので…?やりたかったのですが、思ったほど難しくはありませんでした.
    最初はあまり効果がなかったので、デバッグを印刷してみましたが...