メモ

yukicoderでゆるふわgolf

yukicoder No.668 6.0*10^23

問題はこちら
No.668 6.0*10^23 - yukicoder

桁上りなどに気をつけて、3桁目を四捨五入するコードを書く

char s[1000010];
int main(){
	gets(s);
	int s0=s[0]-48;
	int s1=s[1]-48;
	int s2=s[2]-48;
	int n=strlen(s)-1;
	
	if(s2>=5)s1++;
	if(s1>9){
		s1=0;
		s0++;
	}
	
	if(s0>9)printf("1.0*10^%d",n+1);
	else printf("%d.%d*10^%d",s0,s1,n);
}

これを素直に縮めるとこう

char s[1<<17];
main(f){
	gets(s);
	s[2]>52?++s[1]>57?s[1]=48,++*s>57?*s=49,f=0:0:0:0;
	printf("%c.%c*10^%d",*s,s[1],strlen(s)-f);
}

123B
配列をとらずに入力を1Bずつ読むとむしろ長くなる

a,b,c,t;
main(f){
	for(;read(0,&t,1);)++c<3?a=b,b=t:c<4?t>52?++b>57?b=48,++a>57?a=49,f=0:0:0:0:0;
	printf("%c.%c*10^%d",a,b,c+~f);
}

125B

よく考えると、出力すべき「a.b*10^c」の「a.b」のところは%.1fでいけそうじゃない?

c;
float s,z=1;
main(t){
	for(;read(0,&t,1);z*=.1)c++<3?s+=(t-48)*z:0;
	printf("%.1f*10^%d",s,s>9.95?s/=10,c-1:c-2);
}

しかしこれは「3350」などで丸めに失敗し「3.3*10^3」と出力されてしまう。
じゃあ4桁読めばいいじゃん、とc++<3をc++<4に変えると、今度は「335」などで改行を読み込んでしまい困る。
「4桁目以降は全て1」と思うことにしてc++<3?s+=(t-48)*z:0;の最後の0をs+=c++<3?(t-48)*z:z;とzに取り替えるとうまくいく。

c;
float s,z=1;
main(t){
	for(;read(0,&t,1);z*=.1)s+=c++<3?(t-48)*z:z;
	printf("%.1f*10^%d",s,s>9.95?s/=10,c-1:c-2);
}

111B

2019/03/16追記
c-1,c-2なんて、いかにも「cをmainの引数にしてください」という感じがする

t;
float s,z=1;
main(c){
	for(;read(0,&t,1);z*=.1)s+=c-->-2?(t-48)*z:z;
	printf("%.1f*10^%d",s,s>9.95?s/=10,-c:~c);
}