srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.432 占い(Easy)

問題

問題概要

隣りあったの数字をたす。足した値が2桁になるときは10の位と1の位の数字をたす。1桁ならそのまま。この操作を続けていき、さいご1桁になった時、どのような数字になるかを求める。

解法

与えられう数字Sの桁は大きいので文字列として受け取る。受け取ったら、s[i]とs[i + 1]という隣あった数字を数字としてたす。その数字が10以上になった場合、1の位と10の位の数字の和になるので、now / 10 + now % 10で求める。(now/10は10の位を求め、now%10は1の位を求めている)
次に、できた数字を文字列tmpに格納していく。すべての隣り合ったものに対してこの処理を行ったら、sをtmpで更新してまた同じ処理を繰り返す。これをsが1桁になるまで繰り返せば答えになる。

ミス

なし。

コード

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
#define rep(i,n) for(int i=0;i<(n);i++)
const int INF = 1e9;

int main(void){
    int t; cin >> t;
    for (int i = 0; i < t; ++i){
        string s; cin >> s;
        while(s.size() != 1){
            string tmp;
            rep(i, s.size() - 1){
                int now = s[i] - '0' + s[i + 1] - '0';
                int k;
                if(now >= 10){
                    k = now / 10 + now % 10;
                }else{
                    k = now;
                }
                tmp += to_string(k);
            }
            s = tmp;
        }
        cout << s << endl;
    }
    return 0;
}