Ex06Ans

From Prog0

Jump to: navigation, search

演習第6回

Contents

解答例

A問題

A-1 forループによる3の倍数の和の計算

ファイル名: ex06a1.c

#include <stdio.h>

int main()
{
  int n, sum = 0;
  int i;

  printf("整数を入力して下さい:");
  scanf("%d", &n);

  for(i = 1 ; i <= n ; i++){
    if((i % 3) == 0){
      sum += i;
    }
  }
  printf("%d以下で3の倍数となる正の整数の和は%dです\n", n, sum);
  return 0;
}

A-2 break, continueの利用

ファイル名: ex06a2.c

#include <stdio.h>

int main()
{
  int i;
  int count;
  int score;

  int L = 50;
  int U = 80;

  count = 0;
  printf("点数を入力して下さい\n");
  for(i = 0; i < 15; i++){
    scanf("%d", &score);

    if (score < 0) break;
    if (score < L || score >= U) continue;

    count++;
  }
 
  printf("%d点以上、%d点未満の答案の数は%dです\n", L, U, count);

  return 0;
}

B問題

B-1 階乗の計算

ファイル名: ex06b1.c

#include <stdio.h>

int main()
{
  int i, n;
  int fact = 1;

  printf( "階乗を計算したい数を入力して下さい: " );
  scanf( "%d", &n );

  if( n >= 13 || n < 0 ) {
    printf( "計算できません\n" );
  }
  else {
    for( i = n; i > 0; i-- ) {
      fact *= i;
    }
    printf( "%d\n", fact );
  }
  return 0;
}

B-2 「組み合わせ」の計算

ファイル名: ex06b2_1.c

#include <stdio.h>

/*
 * nCrの計算を、「まじめ」に行った場合
 * まずn!, 次に(n-r)!, さらにr!を計算し、割っている。
 */

int main()
{
  int n, r, ncr, i;
  int fact_n = 1, fact_n_r = 1, fact_r = 1;

  printf( "nとrを入力してください:" );
  scanf( "%d %d", &n, &r );

  /* n!の計算 */
  for( i = 1; i <= n; i++ ) {
    fact_n *= i;
  }

  /* (n-r)!の計算。変数の再利用も実施 */
  for( i = 1; i <= (n-r); i++ ) {
    fact_n_r *= i;
  }

  /* r! の計算。変数の再利用も実施 */
  for( i = 1; i <= r; i++ ) {
    fact_r *= i;
  }

  ncr = fact_n / fact_n_r / fact_r;

  printf( "%dC%d = %d\n", n, r, ncr );
  return 0;
}

ファイル名: ex06b2_2.c

#include <stdio.h>

/*
 * nCrの計算を少し工夫して行う場合
 * nCr = n(n-1)…(n-r+1) / r!   になることを利用。
 */

int main()
{
  int n, r, ncr, i;
  int fact = 1, fact_r = 1;  

  printf( "nとrを入力してください:" );
  scanf( "%d %d", &n, &r ); 

  /* 分子 (n-r+1)*(n-r+2)*...*n の計算 */
  for( i = n-r+1; i <= n; i++ ) {
    fact *= i;
  } 

  /* 分母 r! の計算。変数の再利用も実施 */
  for( i = 1; i <= r; i++ ) {
    fact_r *= i;
  }

  ncr = fact / fact_r; 

  printf( "%dC%d = %d\n", n, r, ncr );
  return 0;
}

B-3 利子の複利計算

ファイル名: ex06b3.c

#include <stdio.h>

int main()
{
  int i, p, n;
  int debt = 10000;

  printf( "利率と期間を整数で入力して下さい:" );
  scanf( "%d%d", &p, &n );

  for( i = 1; i <= n; i++ ) {
    debt = debt * (1 + (double)p/100);
  }

  printf( "%dヶ月後の借金は %d円です\n", n, debt );
  return 0;
}

Extra問題

E-1 素数判定

ファイル名: ex06e1.c

#include <stdio.h>

int main(){
  int i, j;
  int n;
  int c = 0;
  int is_prime;

  for(i = 0; i < 5; i++) {
    printf("%d個目の整数を入力してください:", i+1);
    scanf("%d", &n);
    if (n <= 0) {
      printf("入力は正の整数にしてください\n");
      continue;
    }
    if (n == 1) {
      printf("入力された整数が 1 なのでスキップします\n");
      continue;
    }

    is_prime = 1;
    for(j = 2; j <= n-1; j++) {
      if (n % j == 0) {
        is_prime = 0;
        break;
      }
    }

    if (is_prime == 1) {
      printf("%d は素数\n", n);
      c++;
    }
  }

  printf("素数は %d 個ありました\n", c);
  return 0;
}
Personal tools