OIT Archive
C演習I 14
最終更新:
oit-archive
-
view
worke1.c
- #include <stdio.h>
-
- #define KETA 12
-
- int main(void){
- /* 整数8421065536の多倍長数表現 */
- int a[KETA] = {0, 0, 8, 4, 2, 1, 0, 6, 5, 5, 3, 6};
- int b[KETA];
- int i;
-
- /* 多倍長数aを多倍長数bにコピーする */
- for (i=0; i<KETA; i++){
- b[i] = a[i];
- }
-
- /* 配列bの内容を表示する */
- for (i=0; i<KETA; i++){
- }
-
- return 0;
- }
-
worke2.c
- #include <stdio.h>
- #define KETA 12 /* 多倍長数の桁数 */
- int main(void){
- int a[KETA];
- int i;
-
- /* 多倍長数aをキーボードから入力 */
- for (i=0; i<KETA; i++){
- }
-
- /* 多倍長数aを表示 */
- i=0;
- while (a[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
- return 0;
- }
-
worke3.c
- #include <stdio.h>
- #define KETA 12 /* 多倍長数の桁数 */
- int main(void){
- int a[KETA] = {0, 0, 8, 4, 2, 1, 0, 6, 5, 5, 3, 6};
- int b[KETA] = {0, 0, 8, 6, 4, 2, 0, 9, 7, 5, 3, 1};
- int c[KETA];
- int i, tmp;
- int carry = 0; /* 下位からの繰り上がり */
-
- /* 多倍長数(c)←多倍長数(a)+多倍長数(b) */
- carry = 0;
- for (i=KETA-1; i>=0; i--){
- tmp = a[i] + b[i] + carry;
- c[i] = tmp % 10;
- carry = tmp / 10;
- }
-
- /******** 別解 ****************
- for (i=0; i<KETA; i++){
- c[i] = a[i] + b[i];
- }
- for (i=KETA-1; i>=1; i--){
- c[i-1] = c[i-1] + c[i]/10;
- c[i] = c[i] % 10;
- }
- ******** ここまで別解 ********/
-
- /* cの内容を出力(課題2を再利用) */
- i=0;
- while (c[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
-
- return 0;
- }
-
worke4.c
- #include <stdio.h>
- #define KETA 12 /* 多倍長数の桁数 */
- int main(void){
- int a[KETA] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0};
- int b[KETA] = {0, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
- int i;
-
- /* 多倍長数(a) ← 多倍長数(a) - 多倍長数(b) */
- for (i=KETA-1; i>=0; i--){
- a[i] = a[i] - b[i];
- if (a[i] < 0){
- /* (注意)(a>bを仮定しているので,
- 添字(i-1)が負になることは無い */
- a[i-1]--;
- a[i] = a[i] + 10;
- }
- }
-
- /* aの内容を出力(課題2を再利用) */
- i=0;
- while (a[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
-
- return 0;
- }
-
worke5.c
- #include <stdio.h>
- #define KETA 12 /* 多倍長数の桁数 */
- int main(void){
- int a[KETA] = {0, 0, 0, 0, 0, 0, 0, 6, 5, 5, 3, 6};
- int x = 35;
- int i;
- int tmp;
- int carry = 0; /* 下位からの繰り上がり */
-
- /* 多倍長数(a) ← 多倍長数(a) * int型(x) */
- for (i=KETA-1; i>=0; i--){
- tmp = a[i] * x + carry;
- a[i] = tmp % 10;
- carry = tmp / 10;
- }
-
- /******** 別解 ********
- for (i=0; i<KETA; i++){
- a[i] = a[i] * x;
- }
- for (i=KETA-1; i>=1; i--){
- a[i-1] = a[i-1] + a[i]/10;
- a[i] = a[i] % 10;
- }
- ******** ここまで別解 ********/
-
- /* aの内容を出力(課題2を再利用) */
- i=0;
- while (a[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
-
- return 0;
- }
-
worke6.c
- #include <stdio.h>
-
- #define KETA 100 /* 多倍長数の桁数 */
- #define N 50 /* 1からNまでの階乗を計算する */
-
- int main(void){
- int fact[KETA] = {0};
- int i; /* 多倍長数を操作するときのループ変数 */
- int n; /* 1からNまでの階乗を計算するときのループ変数 */
- int tmp;
- int carry = 0;
-
- /* 多倍長数factを1に設定する.配列の宣言時に全要素を0で
- 初期化しているので,末尾要素に1を格納するのみでよい.*/
- fact[KETA-1] = 1;
-
- for (n=1; n<=N; n++){
-
- /* 多倍長数(fact) ← 多倍長数(fact) * int型(n)
- (課題5のプログラムを再利用) */
- for (i=KETA-1; i>=0; i--){
- tmp = fact[i] * n + carry;
- fact[i] = tmp % 10;
- carry = tmp / 10;
- }
-
- /* 多倍長数aを表示(課題2のプログラムを再利用) */
- i=0;
- while (fact[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
- }
- return 0;
- }
-
worke7.c
- #include <stdio.h>
- #define KETA 12
- int main(void){
- int a[KETA] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1};
- int x = 365;
- int i;
- int tmp;
-
- /* 多倍長数(a) ← 多倍長数(a) ÷ int型(x) */
- tmp = 0;
- for (i=0; i<KETA; i++){
- tmp = tmp*10 + a[i];
- a[i] = tmp / x;
- tmp = tmp % x;
- }
-
- /* 多倍長数aを表示(課題2を再利用) */
- i=0;
- while (a[i]==0 && i<=KETA-2){
- i++;
- }
- while (i<KETA){
- i++;
- }
- return 0;
- }
-