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

メモ

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

yukicoder No.219 巨大数の概算

問題はこちら
No.219 巨大数の概算 - yukicoder

x^yは10^(y*log10(x))であることを利用すれば
Z=floor(y*log10(x))
X.Y...=10^frac(y*log10(x)) となる(frac(x):=x-floor(x))

問題公開当初は正確に求める必要があり、9.9999...×10^Zや1.0000... ×10^Zみたいなケースで殺しに行っていたようだけど、誤差許容になったので適当にやっても通るようになった。

int main(){
	double f;
	long a,b;
	int n;
	scanf("%d",&n);
	while(n--){
		scanf("%ld%ld",&a,&b);
		a=f=log10(a)*b;
		//doubleをintに代入すると切り捨てられる
		b=pow(10,f-a+1);
		//指数を+1しているので、右辺はXY.…となる
		printf("%d %d %ld\n",b/10,b%10,a);
	}
	return 0;
}

よく見るとbはlongでなくても大丈夫なことが分かる
関数の引数は後ろから評価される処理系依存未定義動作で短縮

double f;b,x;main(long a){for(gets(&f);x=~scanf("%ld%d",&a,&b);printf("%d %d %ld\n",x/10,(x=pow(10,f-a+1))%10,a=f=log10(a)*b));}

aの上位には前回の計算結果が残っているかもしれないので、scanfは%ldでしなければならない
128B