問題はこちら
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。謎