[アルゴリズム] の二乗を計算する 1 n個の数字の数 1

スレッド:

S = 111の場合…11 (n桁 1, 十進法), S ^ 2を計算する.
入力
– 最初の行: テストの数をk個 (へ<= 40).
– K次の行, それぞれの行数n – 桁数 1 Sの. (1 <= A <= 1000000)
出力
– 各テスト記録の結果を得るために 1 現在.

入力:
2
1
2
出力:
1
121

ソリューション:
私は対称KQ 123を参照してください。…N…321. 例えば、111はn = 3 ^ 2 = 12321
しかし、nは気づく= 10はかなり右対称ではないようです.
最高経営責任者(CEO: のn = 13 すなわち我々1111111111111 ^ 2.

            1111111111111
           1111111111111
          1111111111111
         1111111111111
+       1111111111111
       1111111111111
      1111111111111
     1111111111111
    1111111111111
   1111111111111
  1111111111111
 1111111111111
1111111111111
=========================
1234567901234320987654321

私たちは、法律はもはや対称であることがわかりません. そして、私はこの意図を持っていた. 私はちょうど対称行くように書く, その後、次を実行します:

私は左のそれぞれで実行し、右、次のコードを持つことになります:

#include <iostream>
#include <string>
using namespace std;
int main()
{
		int k, n;

		cin>>k;
		for (int i=0; i<k; i++)
		{
			cin>>n;
			string s = "";
			int temp = 0;	// temp la phan du khi chi so cho 10. VD 13 thi temp la 1.
			int j = 1, ji = 1;
			// bat dau viet tu phai sang trai
			while (j>0)
			{
				// cong tung cap nhu hinh ((j+temp)%10)
				//sau do chen vao giua
				s.insert(0, 1, (char)((j+temp)%10+'0')); 
				temp = (j+temp)/10;
				if (j==n) ji = -1;	// quay nguoc lai khi du n so
				j += ji;
			}
		cout<<s<<endl;
		}
	return 0;
}

上記のコードの後に, KQて次のよ​​うにいくつかのルールが描画される:
一連に分割されている 3 次のようにヘッダ部が構成されて :
+/ ヘッダ: 123456790123456790123456790… セクションの繰り返しすなわち 123456790 (-1)/9 = N1回.
+ ミドル: 123…X…32 X = nの – 9*N1.
+/ 終わり: N1回繰り返す 098765432 そしていくつかはある 1 やっと. 簡単にするために、我々は中央のセクションは、対称すなわちフォームで保つ 12321 次いで、それの前方端部に挿入される 1 最後に.

#include <iostream>
#include <string>
using namespace std;
int main()
{
	int k, n;
	
	cin>>k;
	for (int i=0; i<k; i++)
	{
		cin>>n;
		string s = "", s1 = "123456790", s2 = "098765432";
		int n1 = (n-1)/9, n2 = n - 9*n1;
		
		// doan giua
		for (int i=1; i<=n2; i++)
			s.insert(s.length(), 1, (char)(i + '0'));
			
		for (int i=n2-1; i>0; i--)
			s.insert(s.length(), 1, (char)(i + '0'));
		
		// neu n tu 10 tro len
		if (n>9)
		{
			// doan dau
			for (int i=0; i<n1; i++)
				s.insert(0, s1);
			// doan cuoi
			for (int i=0; i<n1; i++)
				s.insert(s.length()-1, s2);
		}
		cout<<s<<endl;
	}
	return 0;
}

イラストKQは= 13 kと入力し 5 数nは (14, 37, 30, 113, 352) それぞれの図に示されるように.