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