質問: ans+(n-i); } } return 0; } ``` 宜しくお願い致します。
回答: まず、Rubyプログラムで使っている関数の仕様を調べます。 module function Kernel.#gets > > ARGFから一行読み込んで、それを返します。 > > > object ARGF > > スクリプトに指定した引数 (Object::ARGV を参照) をファイル名とみなして、 それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。 ARGV が空なら標準入力を対象とします。 > > > instance method String#to_i > > 文字列を 10 進数表現された整数であると解釈して、整数に変換します。 > > > class Integer > > 整数クラスです。2.4.0 から Fixnum, Bignum は Integerに統合されました。 > > > instance method Integer#times > > self 回だけ繰り返します。 self が正の整数でない場合は何もしません。 > > > instance method Integer#abs > > 自身の絶対値を返します。 > > > module function Kernel.#puts > > 引数と改行を順番に 標準出力 $stdout に出力します。 引数がなければ改行のみを出力します。 > > 引数が配列の場合、その要素と改行を順に出力します。 配列や文字列以外のオブジェクトが引数として与えられた場合には、 当該オブジェクトを最初に to_ary により配列へ、 次に to_s メソッドにより文字列へ変換を試みます。 末尾が改行で終っている引数や配列の要素に対しては puts 自身 は改行を出力しません。 > > > instance method Integer#inspect > > 整数を 10 進文字列表現に変換します。 > > > それらから、Rubyプログラムの内容を推測します。仕様が明記されていれば、それを利用します。 おそらく以下のようになるでしょう。 * (標準入力または指定入力ファイルから) 1行分の文字列を読み込んで、それを10進数とみなして整数に変換し、整数変数`n`に格納 * 整数変数`ans`を0に、`i`を1に初期化 * `n`回分、以下の処理を繰り返す + (標準入力または指定入力ファイルから) 1行分の文字列を読み込んで、それを10進数とみなして整数に変換し、整数変数`a`に格納 + `a`から`i`を引いた結果を絶対値に変換し、`ans`に追加 + `a`を`i`に代入 * 上記処理結果の`ans`を10 進数文字列に変換し、標準出力に出力 次に C言語で同等な関数を調べます。 無ければ近い仕様のものや複数の処理の組み合わせで代替します。 以下はC言語ではなくVC++の記述です。 Rubyの`Integer`は最大値がVC++では取り扱えないので、`long long`で代替します。 memset、wmemset gets_s、_getws_s データ型の範囲 atoll、_atoll_l、_wtoll、_wtoll_l abs、labs、llabs、_abs64 _itoa_s、_ltoa_s、_ultoa_s、_i64toa_s、_ui64toa_s、_itow_s、_ltow_s、_ultow_s、_i64tow_s、_ui64tow_s puts、_putws 変換した例が以下になるでしょう。 (ただしMBCS版ですね。UNICODE版やdefineでの切り替え版はもう少し考慮・対処が必要です) 完全に同等とはなりませんが、ほぼ近いものと考えられます。 ``` #include "pch.h" // VC++のコンソールアプリケーション用:C言語版には不要 #include #include #include #define WORK_BUFFER_SIZE 24 #define MAX_INPUT_COLUMN 20 int main() { char buffer[WORK_BUFFER_SIZE] = { 0 }; gets_s(buffer, MAX_INPUT_COLUMN); long long n = atoll(buffer); long long ans = 0; long long i = 1; for (long long counter = 0; counter < n; counter++) { memset(buffer, 0, WORK_BUFFER_SIZE); gets_s(buffer, MAX_INPUT_COLUMN); long long a = atoll(buffer); ans += llabs(a - i); i = a; } memset(buffer, 0, WORK_BUFFER_SIZE); _i64toa_s(ans, buffer, WORK_BUFFER_SIZE, 10); puts(buffer); return 0; } ```