これを実現するためには,整数の中にふくまれている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 }
| (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 |
| 著作者 | 紀平拓男・春日伸弥 |
| 出版社 | ソフトバンク パブリッシング株式会社 |