最適化?メモ
今日大学の部活動?サークル?まだ区別がつかないけど、そこでプログラミング講習なるものをやってました。
今回はwhileということで、aのn乗を出力するコードを書いたんですけど、悔しいミスというか、惜しいところがあったのでメモ。
最初のコードはコレ。そりゃ動きますとも。
#include <stdio.h> int main() { int a, n, i; double result; printf("input a > "); scanf("%d", &a); printf("input n > "); scanf("%d", &n); i = n; result = 1.0; while (i) { if (0 < i) { result *= a; i--; } else { result /= a; i++; } } printf("%d^%d = %lf\n", a, n, result); return 0; }
こっちの方が良かったコード。
#include <stdio.h> int main() { int a, n; double result; printf("input a > "); scanf("%d", &a); printf("input n > "); scanf("%d", &n); printf("%d^%d = ", a, n); result = 1.0; while (0 < n) { result *= a; n--; } while (n < 0) { result /= a; n++; } printf("%lf\n", result); return 0; }
違いは、whileの中身。ifをn回省いている。
その分whileの条件式が変わって結局同じかもだけど、ネストが減るのも良いことじゃないかな。
あと変数が1つ減っている。iなんて要らんかったんや!
おまけ。短さを極めたけどwhile-while間のn++が微妙。
何やってるかというと、最初の「0 < n--」を通ると無条件にnが1小さくなっちゃうので調整している。
結局のところさっきのがベストか。
#include <stdio.h> int main() { int a, n; double result = 1; printf("input a > "); scanf("%d", &a); printf("input n > "); scanf("%d", &n); printf("%d^%d = ", a, n); while (0 < n--) result *= a; n++; while (n++ < 0) result /= a; printf("%lf\n", result); return 0; }