課題
- 整数 n について、nが3の倍数であるかどうかを判定する問題を考えよう。この問題を解決するアルゴリズム(解法、手順)を、プログラミングしなさい。
- あなたが考えたプログラムは、判定する整数 n の値が大きくなるにつれて、どのように実行時間が増加するだろうか。以下の3つから選び、理由を説明しよう。
- nの大小の関係なく、実行時間は一定、とみなしてよい。
- nが大きくなるにつれて、おおよそ、nの大きさに比例して増加する、と考えてよい (実際はコンピュータの処理速度が速すぎて、相当大きなnで比較しないと、そんなに差がつかない)
- nが大きくなるについて、おおよそ、log (n)に 比例して増加する、と考えてよい
実行例 (nと、nが3の倍数かどうかの判定だけでよい。各自の実行例でも確認しよう)
n ? 32451 ←(ここは、入力です) 3の倍数です ← (ここは、出力です) (ここまで) [以下は、参考プログラムの実行例です] n = 32451 ← intとして読み込まず、文字列として受け取って、いろいろ操作 m桁 : 5 文字列の長さが、桁数 3 先頭の数3 2 4 5 1 最後の数1 [ここまで:intとして読み込んで、桁数を求める方法もある]
1. 2. の方法ではないアルゴリズムに使いそうなプログラム (参考のプログラムです)
- 単純な方法ではないアルゴリズムにチャレンジする人は、整数を文字列として入力する必要があるかもしれません。
- 文字列の扱い方、数の文字列を1つの整数に変換する方法、1文字の数を1桁の整数に変換する方法が含まれています。
- 整数を入力し、10で割った余りを利用していく作戦にも使えるかも。
[参考、関連プログラム] [解答例]
#include <stdio.h> #include <stdlib.h> /* 「スタンダード リブ」 */ #include <string.h> /* 「ストリング ドット エイチ」 */ int main(void) { char s[100]; /* 入力文字列 */ int n; /* 整数 */ int m; /* 桁数 */ int i; /* 配列のインデックス */ int d; /* 1文字数を、1桁の整数へ */ /* ↓の操作を参考にしながら、作成してください */ printf("n ? \n"); scanf("%s", s); /* 入力した数は、文字列に */ n = atoi(s); /* 文字列を10進数整数へ変換 アスキーto i 「エートゥアイ」*/ m = strlen(s); /* 文字列の長さを求める関数0501を、組み込み関数で 桁数 */ /* 「エスティアール レン あるいはストリングレン」 printf("\nn = %d\n", n); printf("m桁 : %d\n", m); while (s[i] != '\0') { /* 文字列操作定番 0501 */ /* 「エス 角カッコ アイ」 */ d = s[i] - 48; /* アスキーコード48は '0' 1文字。アスキーコードから1桁の整数値を求める */ printf ("%d\n", d); i++; } return 0; }
コメント
同じ問題に、異なるアルゴリズム(手順、解法)
あなたのアルゴリズムの処理時間は、どのように増加していくだろう 。nが大きくなると、処理時間はどのように増加するだろうか。どの基本関数の増加の仕方に近いか。