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

メモ

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

yukicoder No.164 ちっちゃくないよ!!

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