/*
出されたお題をコーディングして罵られるスレ
http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354393458/18
実数 x の n 乗根を求めよ。
ただし、
・math.hを使わない
・double x > 1.0 の任意
・int n > 1 の任意
*/
#include<stdio.h>
#include<stdlib.h>
//#include<float.h>
int main()
{
char buff[256];
double x;
int n;
int i;
double xmin, xmax, tmp, seki;
while (1) {
// 入力
printf("\n入力 (範囲外の数値を入力するか、Ctrl+C で終了)\n"); fgets(buff
, sizeof(buff
), stdin
); if (x <= 1.0) {
return 1;
}
fgets(buff
, sizeof(buff
), stdin
); if (n <= 1) {
return 2;
}
// xmax, xmin の中間値 tmp を実際にn乗した結果を目的の x と比較して、
// 違えば xmax, xmin の値を狭めていく
xmin = 1.0;
xmax = x;
while (1) {
// 中間値
tmp = (xmin + xmax) / 2;
// tmp が xmax, xmin どちらかにくっついてしまったら、これまで
if (tmp == xmin || tmp == xmax) {
break;
}
// 実際にn乗
seki = 1.0;
for (i = 0; i < n; i++) {
seki *= tmp;
}
// 判定して狭める
if (seki < x) {
xmin = tmp;
} else if (seki > x) {
xmax = tmp;
} else {
break; // ジャスト
}
}
// 結果表示
printf("result = %.10f\n", tmp
); // 確認
seki = tmp;
for (i = 1; i < n; i++) {
seki *= tmp;
}
printf("(check = %.10f)\n", seki
); }
return 0;
}
//DBL_EPSILON
LyoKICAgIOWHuuOBleOCjOOBn+OBiumhjOOCkuOCs+ODvOODh+OCo+ODs+OCsOOBl+OBpue9teOCieOCjOOCi+OCueODrAogICAgaHR0cDovL3QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmgubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xMzU0MzkzNDU4LzE4CiAgICAgICAg5a6f5pWwIHgg44GuIG4g5LmX5qC544KS5rGC44KB44KI44CCCiAgICAgICAg44Gf44Gg44GX44CBCiAgICAgICAg44O7bWF0aC5o44KS5L2/44KP44Gq44GECiAgICAgICAg44O7ZG91YmxlIHggPiAxLjAg44Gu5Lu75oSPCiAgICAgICAg44O7aW50IG4gPiAxIOOBruS7u+aEjwoqLwojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdGRsaWIuaD4KLy8jaW5jbHVkZTxmbG9hdC5oPgoKaW50IG1haW4oKQp7CiAgICBjaGFyIGJ1ZmZbMjU2XTsKICAgIGRvdWJsZSB4OwogICAgaW50IG47CiAgICBpbnQgaTsKICAgIGRvdWJsZSB4bWluLCB4bWF4LCB0bXAsIHNla2k7CgogICAgd2hpbGUgKDEpIHsKICAgICAgICAvLyDlhaXlipsKICAgICAgICBwcmludGYoIlxu5YWl5YqbICjnr4Tlm7LlpJbjga7mlbDlgKTjgpLlhaXlipvjgZnjgovjgYvjgIFDdHJsK0Mg44Gn57WC5LqGKVxuIik7CiAgICAgICAgcHJpbnRmKCIgeCAoPjEuMCkgPSAiKTsKICAgICAgICBmZ2V0cyhidWZmLCBzaXplb2YoYnVmZiksIHN0ZGluKTsKICAgICAgICB4ID0gYXRvZihidWZmKTsKICAgICAgICBpZiAoeCA8PSAxLjApIHsKICAgICAgICAgICAgcHJpbnRmKCJleGl0XG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiIG4gKD4xICApID0gIik7CiAgICAgICAgZmdldHMoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCBzdGRpbik7CiAgICAgICAgbiA9IGF0b2koYnVmZik7CiAgICAgICAgaWYgKG4gPD0gMSkgewogICAgICAgICAgICBwcmludGYoImV4aXRcbiIpOwogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICAgICAgLy8geG1heCwgeG1pbiDjga7kuK3plpPlgKQgdG1wIOOCkuWun+mam+OBq27kuZfjgZfjgZ/ntZDmnpzjgpLnm67nmoTjga4geCDjgajmr5TovIPjgZfjgabjgIEKICAgICAgICAvLyDpgZXjgYjjgbAgeG1heCwgeG1pbiDjga7lgKTjgpLni63jgoHjgabjgYTjgY8KICAgICAgICB4bWluID0gMS4wOwogICAgICAgIHhtYXggPSB4OwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIC8vIOS4remWk+WApAogICAgICAgICAgICB0bXAgPSAoeG1pbiArIHhtYXgpIC8gMjsKICAgICAgICAgICAgLy8gdG1wIOOBjCB4bWF4LCB4bWluIOOBqeOBoeOCieOBi+OBq+OBj+OBo+OBpOOBhOOBpuOBl+OBvuOBo+OBn+OCieOAgeOBk+OCjOOBvuOBpwogICAgICAgICAgICBpZiAodG1wID09IHhtaW4gfHwgdG1wID09IHhtYXgpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOWun+mam+OBq27kuZcKICAgICAgICAgICAgc2VraSA9IDEuMDsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgICAgc2VraSAqPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5Yik5a6a44GX44Gm54ut44KB44KLCiAgICAgICAgICAgIGlmIChzZWtpIDwgeCkgewogICAgICAgICAgICAgICAgeG1pbiA9IHRtcDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzZWtpID4geCkgewogICAgICAgICAgICAgICAgeG1heCA9IHRtcDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvLyDjgrjjg6Pjgrnjg4gKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyDntZDmnpzooajnpLoKICAgICAgICBwcmludGYoInJlc3VsdCA9ICUuMTBmXG4iLCB0bXApOwogICAgICAgIC8vIOeiuuiqjQogICAgICAgIHNla2kgPSB0bXA7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgICAgICBzZWtpICo9IHRtcDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIoY2hlY2sgPSAlLjEwZilcbiIsIHNla2kpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovL0RCTF9FUFNJTE9O