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

メモ

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

yukicoder No.432 占い(Easy)

問題はこちら
No.432 占い(Easy) - yukicoder

問題文のとおりに操作をすれば良い

char s[1010];
int main(){
	int i;
	gets(s);
	for(;gets(s);){
		while(strlen(s)>1){
			for(i=0;i<strlen(s)-1;i++){
				s[i]+=s[i+1]-'0';
				if(s[i]>'9')s[i]-=9;
			}
			s[i]='\0';
		}
		puts(s);
	}
	return 0;
}

まず何の工夫もなく縮めて

char s[1010];
int main(i){
	for(gets(s);gets(s);puts(s))
		for(;s[1];s[i]=0)
			for(i=0;i<strlen(s)-1;i++)
				s[i]+=s[i+1]-48,
				s[i]>57?s[i]-=9:0;
}

一番内側のループをポインタで回すことにして

char*p,s[1010];
int main(i){
	for(gets(s);gets(s);puts(s))
		for(;s[1];*p=0)
			for(p=s;p[1];p++)
				*p+=p[1]-48,
				*p>57?*p-=9:0;
}

最後に9を引く計算を少し工夫して、配列サイズを省略すると完成

char*p,s[];
main(){
	for(gets(s);gets(s);puts(s))
		for(;s[1];*p=0)
			for(p=s;p[1];*p-=*p++/58*9)*p+=p[1]-48;
}

101B

2016/12/04追記
1行目の読み飛ばし下手なの?

char*p,s[];
main(i){
	for(;gets(s);--i&&puts(s))
		for(;s[1];*p=0)
			for(p=s;p[1];*p-=*p++/58*9)*p+=p[1]-48;
}

100B