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