torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

TopCoder SRM 614, Division 2, Level 1 : MicroStrings

問題概要

 正整数 A, D ( 1 \leq A, D \leq 200 ) が与えられる。初項 A 、公差 -D の等差数列を考える。等比数列の内で非負である要素を、数列に出現する順に文字列として連結することで得られる文字列を計算せよ。

解法

 数列の内、答えに関係する要素の数は高々 200 なので、問題文に書かれている定義通り実装することで解くことができます。すなわち、A が非負である間、A を文字列変換したものを構成途中の文字列に連結し、A から D を減じて A を更新するという処理を繰り返します。整数を文字列に変換するには、C++ であれば文字列ストリーム( stringstream )を使うと楽に行うことができます。 

コード

template < typename T > inline string toString( const T &a ){ ostringstream oss; oss << a; return oss.str(); };

class MicroStrings
{
public:
	string makeMicroString( int A, int D )
	{
		string res;
		while ( 0 <= A )
		{
			res += toString( A );
			A -= D;
		}
		return res;
	}
};