ZerOx4Cの日記だったもの

インポートだけしました

最適化?メモ

今日大学の部活動?サークル?まだ区別がつかないけど、そこでプログラミング講習なるものをやってました。
今回は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;
}