2017年4月10日 更新

 

知り合いのページでプログラミングテストをしていたので「中途半端に」やってみた (相当前の記事だが)

 

与えられた文字列に対して、数字を挿入する関数を記述してください。
挿入ルールは、最初に”1″、1文字あけて”2″、2文字あけて”3”、・・・(英字が与えられる前提でOK、スペースやカンマも1文字と数える。)
ただし最後は、あける文字数によらず数字で終わらせる。

例)
Hello Jason, how are you?
→1H2el3lo 4Jaso5n, ho6w are 7you?8

 

とりあえずC言語のプログラムを作る環境が手元に無いので、少しコードを変えるだけでC言語で実装できるような形でJavaScriptで「中途半端に」作った。

「中途半端に」というのは、途中までしか作ってないから。

追加する長さが分かれば、後は消化試合みたいなものなので、追加する長さを求める。

 

 

 

再起を使用したもの。コードはスッキリしているが個人的には再起はワケワカラなくなるので嫌いです。

	function GetAppendNum(restNum, next)
	{
		if (restNum <= 0)
		{
			return next;
		}

		return GetAppendNum(restNum - next, next + 1);
	}
	function GetTotalLengthCore(appendNum, next)
	{
		if (appendNum - next + 1 <= 0)
		{
			return 0;
		}

		return appendNum - next + 1 + GetTotalLengthCore(appendNum, next * 10);
	}
	function GetTotalLength(origLength)
	{
		return GetTotalLengthCore(GetAppendNum(origLength, 1), 1);
	}

 

 

 

こちらは普通にループ処理にしたもの。コードが増えるけど個人的にはコチラのほうが分かりやすくて好き。

	function GetTotalLengthNew(origLength)
	{
		var n;
		var keta;
		var sum;
		var totalLength;
		var keta_tempNum;
		
		sum = 0;
		for (n = 1; sum < origLength; n++)
		{
			sum += n;
		}
		
		// Javascript版
		// keta = ("" + n).length;
		// 多言語版 (sprintfを使おうとしたけどnを文字列にするのにもnの桁数が不明なので複雑な処理が必要になる)
		keta_tempNum = n;
		for (keta = 1; parseInt(keta_tempNum / 10) > 0; keta++)
		{
			keta_tempNum = parseInt(keta_tempNum / 10);
		}
		
		totalLength = 0;
		
		for (i = 1; keta - i >= 0; i++)
		{
			totalLength += n - Math.pow(10,keta - i) + 1;
		}
		
		return totalLength;
	}

 

 

 

以下が実行可能なサンプル。

 

 

■sample1 … 普通のループ処理で作ったもの
文字の長さを入れる

ここに実行結果が表示されます

 

 

■sample2-1 … 再起処理で作ったもの
文字の長さを入れる

ここに実行結果が表示されます

 

 

■sample2-2 … 再起処理で作ったもの (長さではなく文字を入力する)
文字を入れる


ここに実行結果が表示されます

 

 

ページ元のあの方は三角数?という処理をしていたが、このように算数の虫食い算的に求めるだけでいいのではないか、と思ったので作った。

(多分今回は力が有り余ったので特殊なやり方をしたんじゃないかな、とも思ったが…)

 

もし、その処理をしなければならない理由があるならば、逆にその理由が知りたいとも思ったが、

この人は怖いのでアウェーに質問しに行くのが怖くてやめましたw

 

 

そういえば、よく考えたら言語自由らしいので、C言語以外のほとんどの言語なら文字列の長さを気にしないで済むのでスゲー簡単な気がしてきた。

C言語という選択は、まさにイバラの道だ。

まぁ他の言語で作っても、ほとんど得点にはならないかも知れないけど。

(自分で問題を作って自分で解くようなものですね)

 

 

以下は数式を導き出すためにメモしたものです。

 

 

このようにする
1a2bc3def4ghij5klmno6p7


左:入力文字数 中央:追加する文字数 右:桁数で追加される文字数

1 2 0

2 3 0  1=1
3 3 0

4 4 0  1+2=3
5 4 0
6 4 0

7 5 0  1+2+3=6
8 5 0
9 5 0
10 5 0

11 6 0  1+2+3+4=10
12 6 0
13 6 0
14 6 0
15 6 0

16 7 0  1+2+3+4+5=15
17 7 0
18 7 0
19 7 0
20 7 0
21 7 0

22 8 0
23 8 0
24 8 0
25 8 0
26 8 0
27 8 0
28 8 0

29 9 0
30 9 0
31 9 0
32 9 0
33 9 0
34 9 0
35 9 0
36 9 0

37 10 1
38 10 1
39 10 1
40 10 1
41 10 1
42 10 1
43 10 1
44 10 1
45 10 1

46 11 2
47 11 2
48 11 2
49 11 2
50 11 2
51 11 2
52 11 2
53 11 2
54 11 2
55 11 2

56 12 3

xx 13 4
xx 14 5
xx 15 6
xx 16 7
xx 17 8
xx 18 9
xx 19 10

xx 99 90
xx 100 92
xx 101 94
xx 102 96

追加される文字数(中央)を n とする
計算結果を総文字数(中央+右) とする
1〜の場合
(n - 1 + 1)
= n

10〜の場合
(n - 1 + 1) + (n - 10 + 1)
= n + n - 9
= 2n - 9

100〜の場合
(n - 1 + 1) + (n - 10 + 1) + (n - 100 + 1)
= n + n - 9 + n - 99
= 3n - 9 - 99
= 3n - 108

1000〜の場合
4n - 9 - 99 - 999 となる予想

10000〜の場合
5n - 9 - 99 - 999 - 9999 となる予想
(n - 1 + 1) + (n - 10 + 1) + (n - 100 + 1) + (n - 1000 + 1) + (n - 10000 + 1)

xxx〜の場合
(n - 10^(nの桁数-1) + 1) +
(n - 10^(nの桁数-2) + 1) +
(n - 10^(nの桁数-3) + 1) +
 + … +
(n - 1 + 1) と計算できる

コメント一覧

下に行くほど新しいコメントです

この記事にコメントを投稿した人はまだいません

コメントをどうぞ

名前:


トップページへ   上に戻る