読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.327 アルファベット列

問題はこちら
No.327 アルファベット列 - yukicoder

求める文字列をf(N)とする。
一番下の文字がN mod 26できまることは明らか。2桁目以降を考えると

N floor(N/26) 2桁目以降
0~25 0 (なし)
26~26*2-1 1 A
26*2~26*3-1 2 B
26*26~26*27-1 26 Z
26*27~26*28-1 27 AA

となるので、よく見るとf(floor(N/26)-1)になっていることが分かる

これにより下位から順に決めることができる

int main(){
	long n;
	int i;
	char s[20];
	//10^12<26^12だから20文字分も用意しておけば十分だろう
	scanf("%ld",&n);
	s[0]='A'+n%26;
	n/=26;
	for(i=0;n;){
		n--;
		s[++i]='A'+n%26;
		n/=26;
	}
	for(;i>=0;i--)putchar(s[i]);
	return 0;
}

計算は下の位からしないといけないけど、出力は上の位からしないといけない……ということはmain再帰だな

i;
main(long n){
	scanf("%ld",&n);
	~n?main(n/26-1),i=!putchar(65+n%26):0;
	//nを26で割る時点で1を引いているので、終了条件は0ではなく-1になる
}

70B

2016/10/16追記
ぐっと睨む

~n?main(n/26-1),i=!putchar(65+n%26):0;
i=~n&&main(n/26-1)*!putchar(65+n%26);

1B短縮
再帰の最後でiに代入されるのは0のはずだからmainの返り値も0になってるはずだし、putcharの前の!は要らないのでは…と思ったが、そうするとRE。謎