基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成21年 秋期 基本情報技術者 午後 問09
問09   C言語

 次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

 C言語では整数型の変数に格納できる値には上限がある。これを超える正の整数 (以下,正の多倍長整数という)の入出力と加算を行うプログラムである。

(1) 正の多倍長整数は,次に示す MP 型の構造体を用いて表現する。

typedef struct{
           int length;
           long data[ARRAY_MAX];
        }MP;

 正の多倍長整数を,下位から9けたずつに切り分けて, 構造体 MP のメンバである配列 data の要素番号の小さい方から順番に値を格納する。 例えば,46284059827463859201283844157134007652918723147641 という整数の場合, 図のとおりになる。

   図 正の多倍長整数の格納例

   構造体のメンバー length には,実際に値を格納した要素数を入れる。図の場合は6である。

(2) 関数の仕様は,次のとおりである。

void set(MP *num, const char str[]);

 引数: num MP 型の構造体で表現された多倍長整数

    str 文字列で表現された多倍長整数であって,1〜9の数字で始まる。

 機能:文字列で与えられた多倍長整数 str を変換して,MP 型の構造体 num に、 格納する。 num のメンバ data は,変換後の数値を格納するのに十分な要素数が 確保されているものとする。

返却値:なし

void print(const MP *num);
引数: num MP 型の構造体で表現された多倍長整数

機能:多倍長整数を出力する。

返却値:なし

void add(const MP *a, const MP *b, MP *c);
引数:a, b, c MP 型の構造体で表現された多倍長整数であり,c は,a 及び b ではないものとする。

機能:二つの多倍長整数 a,b の和を多倍長整数 c に格納する。c のメンバ dataは, 加算処理を行うのに十分な要素数が確保されているものとする。

返却値:なし

(3) 次のライブラリ関数を用いる。

size_t strlen(const char *s);
機能:s が指す文字列の長さを計算する。

返却値:終端を示すナル文字に先行する文字の個数を返す。

〔プログラム〕

#include <stdio.h>
#include <string.h>

#define ARRAY_MAX 100
#define NUM_DIGIT 9
#define NUM_DIGIT_TH_POWER_OF_TEN 1000000000

typedef struct{
           int length;
           long data[ARRAY_MAX];
        }MP;

void set(MP*, const char[]);
void print(const MP*);
void add(const MP*, const MP*, MP*);

/* 文字列から多倍長整数を扱う構造体に変換 */
void set(MP *num, const char str[]){
   int str_idx = strlen(str) - 1;
   int num_idx = 0;
   int i;
   long mul;

   while(  ){
      num->data[num_idx] = 0;
      mul = 1;
      for(i = O;  ; i++){
         num->data[num_idx] += mul * (str[str_idx--]‐'0');
         mul  ;
      }
      num_idx++;
   }
   num->length = num_idx;
}

/* 多倍長整数の出力 */
void print(const MP *num){
   int i;

   printf("%ld", num->data[num->length - 1]);
   for(  ){
      /* ゼロ詰めして必ず9けたを表示する。 */
      printf("%09ld", num->data[i]);
   }
   printf("\n");
}
/* 二つの多倍長整数の加算 */
void add(const MP *a, const MP *b, MP *c){ 
   int i;
   int i_max;

   if(a->length > b->length){
      i_max = a->length; 
   }else{
      i_max = b->length;
   }
   c->data[0] = 0;

   for(i = 0; i < i_max; i++){
      if(i < a->length) c->data[i] += a->data[i];
      if(i < b->length) c->data[i] += b->data[i];

      if(c->data[i] >= NUM_DIGIT_TH_POWER_OF_TEN){  α
         c->data[i + 1] = 1;  β
         c->data[i] -= NUM_DIGIT_TH_POWER_OF_TEN;
      }else{
         c->data[i + 1] = 0;
      }
   }
   if(c->data[i] == 0){
      c->length = i; 
   }else{ 
      c->length = i + 1; 
   }
}

設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア str_idx != 0       イ str_idx < 0       ウ str_idx <= 0

エ str_idx > 0       オ str_idx >= 0       

b に関する解答群 ア i < NUM_DIGIT

イ i < NUM_DIGIT && str_idx <= 0

ウ i < NUM_DIGIT && str_idx >= 0

エ i < NUM_DIGIT || str_idx <= 0

オ i < NUM_DIGIT || str_idx >= 0

c に関する解答群 ア %= 10       イ *= 10       ウ += 10       エ -= 10       オ /= 10 d に関する解答群 ア i = 0; i <= num->length - 1; i++

イ i = 0; i <= num->length - 2; i++

ウ i = num->length - 1; i >= 0; i--

エ i = num->length - 2; i >= 0; i--

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

基本情報技術者試験


設問2 プログラムの動作について, 次の記述中の に入れる正しい答えを解答群の中から選べ。

 関数 add を用いて以下の (1) に示す二つの多倍長整数を加算する場合, プログラム中のα部分は 回実行され, β部分は 回実行される。 また,以下の (2) に示す二つの多倍長整数を加算する場合, β部分は 回実行される。

e 〜g に関する解答群

ア 0       イ 1       ウ 2       エ 3

オ 4       カ 5       キ 6       ク 7

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます

解答 g ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]