問題

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

〔プログラムの説明〕
 C言語では整数型の変数に格納できる値には上限がある。これを超える正の整数(以下、正の多倍長整数という)の入出力と加算を行うプログラムである。
(1)正の多倍長整数は、次に示す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が指す文字列の長さを計算する。
  返却値:終端を示すナル文字に先行する文字の個数を返す。