第6回演習の解答例


(1) 1からnまでの階乗n!を求めるプログラムを作成せよ

#include<stdio.h>
void main()
{
	int a, b;
 
	printf("階乗計算を行います¥n数字を入力してください:");
	printf("a="); scanf("%d", &a);

	printf("%dの階乗は,", a); 

	b=1;

	while(a>0){
		b*=a;		/* b = a * b */
		a--; 		/* a++の逆である.つまりa=a-1のこと */
	}

	printf("%dです.¥n",b);

} 

(2)n!が5000以上になる最小のnを求めるプログラムを作成せよ

#include<stdio.h>
void main()
{
	int a,b;
 
	printf("階乗計算において5000を超える値を探します¥n");
 	
	a=1;
	b=1;

	while(b<5000){
		b*=a;
		a++;
	}
 	printf("5000を超える値は%dの階乗です¥n",a-1); /* どうして a-1 なのか */
} 

(3)2つの入力した整数m,nの最大公約数を求めるプログラムを作成せよ

#include <stdio.h>
void main()
{
	
 	int m, n, tmp, tmpm, tmpn; 		/* tmpは変数一時保管用 */

	printf("最大公約数と最小公倍数を探します¥n");
	printf("数を入力してください¥n");
	printf("m="); scanf("%d",&m);
	printf("n="); scanf("%d",&n);

	tmpm = m;		/* 最小公倍数を求めるために元の数字を保管 */
	tmpn = n;		/* 上記と同じ */

	if(n>m){
		tmp = n;		/* mとnはm>nでないとならないので入れ替え */
		n = m;
		m = tmp;
	}

	while(m%n != 0){
		tmp = n;
		n = m%n;
		m = tmp;
	}

	printf("最大公約数は%dです¥n",n);
	printf("最小公倍数は%dです¥n",tmpm*tmpn/n);		/* 最小公倍数は元の数の乗数に最大公約数で割ると求められる */
} 

(4) 第4回の演習課題(3)を利用して,A君とBさんのどちらかが先に3回勝つまでじゃんけんをさせるようにループして,最後に,「A君(Bさん)が先に3回勝ちました」と表示させるプログラムを作成せよ

#include <stdio.h>
void main()
{
	int a, b, win_a=0, win_b=0;

	while(win_a<3  && win_b<3){
		printf("a君とb君がじゃんけんします.¥nグー : 1 チョキ : 2 パー : 3¥n");
		printf("a君は何を出しますか?"¥n;); scanf("%d", &a);
		printf("b君は何を出しますか?"¥n;); scanf("%d", &b);
	
		if(a < 1 || a > 3 || b < 1 || b > 3){
			printf("1か2か3をちゃんと入力してください¥n");
		}else if(b==(a%3)+1){			/* aの勝ち。*/
			win_a++;
		}else if(b==(((a+1)%3)+1)){ 		/* bの勝ち。*/
			win_b++;
		}else{ 					/* あいこ */
			printf("あいこです.¥n");
		}

		printf("A君:%d勝¥nB君:%d勝¥n",win_a,win_b);

	}

	if(win_a==3){
		printf("A君が先に3回勝ちました¥n");
	}else{
		printf("B君が先に3回勝ちました¥n");
	}
}