人間は時間と紙さえあれば、いくらでも長い桁の計算ができる。ただの計算なので、人間ができてコン ピューターができないわけがない。人間と同じことをコンピューターにやらせれば良いの である。人間と同じように、コンピューターに長桁の筆算の計算をさせる。紙の代わりに データは配列に記憶させるだけである。
これを最初から考えるのは、初心者には少し難しいので、リスト2に プログラムを載せておく。このプログラムでは、非常に大きな桁数の2つの整数を入力し て、その和と差を計算することができる。
このプログラムでは、負の値は10の補数を用いている。もしある数が負の整数であれば、
その絶対値の各桁を10から差し引いて、最後に1を加えている。この辺のところは、3年生
の電子計算機の授業で教えたはずである。ただ、そのときは2進法を使っていたので、2の
補数だったが、考え方は同じである。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 32768 5 #define RADIX 10 6 7 void lf_scan(int n[]); 8 void lf_plus(); 9 void lf_minus(); 10 void lf_print(int n[]); 11 void lf_complement(int n[]); 12 void prt_bit(int n[]); 13 int a[N], b[N], Acc[N]; 14 15 /*================================================================*/ 16 /* main */ 17 /*================================================================*/ 18 int main(void){ 19 20 lf_scan(a); 21 lf_scan(b); 22 lf_plus(); 23 lf_print(Acc); 24 lf_minus(); 25 lf_print(Acc); 26 27 return 0; 28 } 29 30 31 /*================================================================*/ 32 /* lf_scan */ 33 /*================================================================*/ 34 void lf_scan(int n[]){ 35 unsigned char key_in[N]; 36 int i,l,flag=0; 37 38 scanf("%s",key_in); 39 40 l=strlen(key_in); 41 42 if(key_in[0] == '-'){ 43 flag=1; 44 for(i=1; i<l; i++){ 45 key_in[i-1]=key_in[i]; 46 } 47 l--; 48 } 49 50 for(i=0;i<l;i++){ 51 n[i]=(unsigned int)key_in[l-1-i]-48; 52 } 53 54 if(flag==1)lf_complement(n); 55 } 56 57 /*================================================================*/ 58 /* lf_plus */ 59 /*================================================================*/ 60 void lf_plus(){ 61 int i; 62 63 for(i=0;i<N;i++) Acc[i] = a[i]+b[i]; 64 65 for(i=0; i<N-1; i++){ 66 if(Acc[i] > 9)Acc[i+1]++; 67 Acc[i]%=RADIX; 68 } 69 70 Acc[N-1]%=RADIX; 71 72 } 73 74 /*================================================================*/ 75 /* lf_minus */ 76 /*================================================================*/ 77 void lf_minus(){ 78 79 lf_complement(b); 80 lf_plus(); 81 82 } 83 84 /*================================================================*/ 85 /* lf_print */ 86 /*================================================================*/ 87 void lf_print(int n[]){ 88 int i,j,flag=0; 89 90 i=N-1; 91 92 if(n[i]>4){ 93 flag=1; 94 lf_complement(n); 95 printf("-"); 96 } 97 98 while(n[i]==0 && i>0) i--; 99 for(j=i;j>=0;j--)printf("%d",n[j]); 100 101 if(flag==1)lf_complement(n); 102 103 printf("\n"); 104 105 106 } 107 108 /*================================================================*/ 109 /* complement */ 110 /*================================================================*/ 111 void lf_complement(int n[]){ 112 int i; 113 114 for(i=0; i<N; i++) n[i]=9-n[i]; 115 116 n[0]++; 117 118 i=0; 119 while(n[i]==10 && i < N){ 120 n[i]=0; 121 n[i+1]++; 122 i++; 123 } 124 }
期限 8月25日(木) AM 8:55 用紙 A4 提出場所 山本研究室の入口のポスト 表紙 表紙を1枚つけて、以下の項目を分かりやすく記述すること。 授業科目名「計算機応用」 課題名「課題 夏休みの宿題」 5E 学籍番号 氏名 提出日 内容 ソースプログラム(プリントアウトでも、手書きでもOKとする)