問題はこちら
No.164 ちっちゃくないよ!! - yukicoder
strtolという関数を使う
strtol(char*s,char**p,int n)の形で使い、sをn進数と解釈して数値に変換する関数
また、変換に失敗(2進変換を指定したのに文字列内に'2'が登場するなど)したときにはその位置をpに保存する
ただし、文字列の先頭が0xで始まり、基数に16を指定した場合その部分は無視されることに注意が必要
(即ちstrtol("0x1",p,16)は1になる)
#include <stdlib.h> //includeしないとstrtolの返り値がintになる long M=3L<<61,m,n; char s[20],*t; main(i){ scanf("%d\n",&n); while(n--){ gets(s); for(i=1;m=strtol(s,&t,++i),*t!=0||i+54<s[1];); //*t!=0なら変換に失敗、i+54<s[1]は"0x..."対策 M=m<M?m:M; } M=!printf("%ld",M); }
これを縮める
Nの読み飛ばしの時にMの初期化もすることにすれば短縮できる
配列の大きさを省略しても通った
#include<stdlib.h> long M,m; char*t,s[]; main(i){ for(;gets(s);M=M?m<M?m:M:3L<<61)for(i=1;m=strtol(s,&t,++i),*t|i+54<s[1];); M=!printf("%ld",M); }
includeの後は改行が必要なので141B