これを実現するためには,整数の中にふくまれている1の数を数える必要がある.教科書 では以下の手順で,それを行っている.
リスト5 繰り返し文を 使った1の数を数えるプログラム(転載について)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int num_of_one(int value) 5 { 6 int ret; 7 /* valueを次々に10で割って桁をずらしながら, 8 最下位の桁が1であるかどうかを調べていく */ 9 for(ret=0;value >0;value /=10) 10 if(value%10==1) 11 ++ret; 12 return ret; 13 } 14 15 int main(void) 16 { 17 int i; 18 19 scanf("%d",&i); 20 printf("%d中に1は%d個含まれています\n",i,num_of_one(i)); 21 return EXIT_SUCCESS; 22 }
valueの1の数valuevalue | (6) |
このプログラムで使われている主なテクニックは,以下の通りである.
これは,unsigned long int valueと同じで,変数valueの型を符号無し倍々精 度整数で定義(予約)している.こうすると,valueは32ビットで,0〜4294967295 の整数値を使うことができる.
リスト6 再帰 呼び出しを使った1の数を数える関数(転載について)
1 int num_of_one(unsigned long value) 2 { 3 int ret; 4 /* valueが0桁(もうこれ以上解析する桁がない) */ 5 if(value==0) 6 return 0; 7 if(value%10==1) /* いちばん下の位が1 */ 8 ret=1; 9 else 10 ret=0; 11 12 /* 10で割って桁を1つずらし,再びnum_of_one()で調べる */ 13 return ret+num_of_one(value /10); 14 }
リスト7はリスト5と同じプログラムではあるが, 条件演算子2「?」を使ってコンパク トに記述している.
このプログラムで使われている主なテクニックは,以下の通りである.
条件演算子?は,条件式 ? 式1 : 式2と書き,条件式が真ならば式1を,偽ならば式2を値として返す.
リスト7 再帰呼び 出しを使った1の数を数える関数(転載について)
1 int num_of_one(unsigned long value) 2 { 3 if(value==0) 4 return 0; 5 return ( ((value%10)==1) ?1:0) +num_of_one(value/10); 6 }
リスト8 2つの整数の 最大公約数を求める関数(転載について)
1 int gcd(int a,int b) 2 { 3 int i; 4 for(i=a;i>0;i--) 5 if(a%i==0 && b%i==0) 6 break; 7 return i; 8 }
このプログラムも漸化式のようなものを考えると,次のようになる.
(7) |
リスト 再帰呼び出し を使い複数の整数の最大公約数を求める関数(転載について)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MAX 6 5 int N[MAX]={98,140,84,28,42,126}; 6 7 int gcd(int a,int b) 8 { 9 int i; 10 for(i=a;i>0;i--) 11 if(a%i==0&&b%i==0) 12 break; 13 return i; 14 } 15 16 int multi_gcd(int n) 17 { 18 /* n==1(数が2つしかない)の場合は,普通にgcdを呼ぶだけ */ 19 if(n==1) 20 return gcd(N[0],N[1]); 21 22 /* n>1の場合は,N[n]と,N[0]..N[n-1]のgcd を呼び出す */ 23 return gcd(N[n],multi_gcd(n-1)); 24 } 25 26 int main(void) 27 { 28 printf("配列Nの最大公約数は%dです\n",multi_gcd(MAX-1)); 29 return EXIT_SUCCESS; 30 }
[転載について]
このページ中のリスト5とリスト6,リスト7,リスト8,リスト9のプログラムは,教科書として使用している以下の書籍
書名 | プログラミングの宝箱 アルゴリズムとデータ構造 ISBN4-7973-2419-8 |
著作者 | 紀平拓男・春日伸弥 |
出版社 | ソフトバンク パブリッシング株式会社 |