Memorandums?

This blog is written about technical-discoveries and daily-events.

AOJを解く part2

problem 2508:

暗号化された文字列を鍵にしたがって復号せよ

//暗号化された文字列
ABC

//復号鍵
1 2 3

//解読された文字列
'A'-1 'B'-2 'C'-3 → zzz

ルールは細かいので問題はAOJでご覧下さい.
Aizu Online Judge -problem 2508

#include<stdio.h>

int main()
{	
	int n, i, j;
	while((scanf("%d", &n)!=EOF) && n){
		int key[100] = {};
		char s[100] = {};
		char ans[100] = {};
		
		for(i = 0; i < n; i++)		scanf("%d", &key[i]);
		for(i = n; i < 100; i++)	key[i] = key[i%n];
		
		scanf("%s", s);
		
		for(i = 0; i < 100; i++)	if(s[i]!='\0')	ans[i] = s[i];
		
		for(i = 0; i < 100; i++)
		{
			if(s[i] == '\0')	break;
			for(j = 0; j < key[i]; j++)
			{
				if(ans[i] == 'a')	ans[i] = 'Z';
				else if(ans[i] == 'A')	ans[i] = 'z';
				else	ans[i]--;
			}
		}
		printf("%s\n", ans);
	}
	return 0;
}


    手順としては,
  1. 鍵の個数を入力させ,EOFもしくは0の場合に終了する
  2. 鍵の配列を生成し,100個の要素を確保する
  3. 鍵の個数がn個だった場合,鍵の要素番号0~n-1に鍵をそれぞれ入れ,
    n~2n-1, 2n~3n-1,...にも同じパターンを繰り返す
    例えば,n=3, 鍵のパターンは3,2,1だった場合,

    key[0] [1] [2] [3] ... [99]
    3 2 1 3 ... 3
    となり,key[i] = key[i%n]となります.
  4. 解読結果格納配列ansに暗号化されている文字列sを入れておき,
    keyにしたがって,引き算します.
    'a'のとき,引くと'Z', 'A'のとき,引くと'z'になる点に注意です.
  5. ansを表示し,終了