3 進数表示が p 桁の自然数 N は 3^(p-1) ≦ N < 3^p を満たすので、 常用対数をとることにより、 p と N の関係式
p - 1 ≦ log10(N) / log10(3) < p ... (式2)
が成り立つことがわかる。
(問1) 3 進数表示が 1212 である自然数は [アイ] である。
(問2) 自然数 N を与え、その 3 進数表示を求めよう。 (式1) の N を 3^(p-1) で割った 商が a(p-1) であることに着目して、 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) を *上の位の数から順に* 出力する (プログラム1) を作成した。また、 (式1) の N を 3 で 割った余りが a(0) であることに着目して、 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) を *下の位の数から順に* 出力する (プログラム2) を作成した。ただし、 INT(X) は X を超えない最大の整数を表す関数である。また、 LOG10(X) は X の常用対数を表す関数 であり、 (式2) により、いずれのプログラムにおいても、 110 行は入力された自然数 N または M の 3 進数表示の桁数を P に代入している。
5 :デフォルトの名無しさん:2014/01/19(日) 13:16:32.85
(プログラム1) 100 INPUT N 110 LET P=INT(LOG10(N)/LOG10(3))+1 120 LET X=3^(P-1) 130 FOR I=1 TO P 140 PRINT [ウ] 150 LET N=[エ] 160 LET X=[オ] 170 NEXT I 180 END
(プログラム2) 100 INPUT M 110 LET P=INT(LOG10(M)/LOG10(3))+1 120 FOR I=1 TO P 130 PRINT M-INT(M/3)*3 140 LET M=INT(M/3) 150 NEXT I 160 END
(プログラム3) 100 INPUT N 110 LET P=INT(LOG10(N)/LOG10(3))+1 120 LET X=3^(P-1) 130 [コ] 140 FOR I=1 TO INT(P/2) 150 LET A=[ウ] 160 LET N=[エ] 170 LET X=[オ] 180 LET B=M-INT(M/3)*3 190 LET M=INT(M/3) 200 [サ] 210 NEXT I 220 PRINT "一致する" 230 GOTO 250 240 PRINT "一致しない" 250 END
7 :デフォルトの名無しさん:2014/01/19(日) 13:22:56.80
(プログラム3) の [コ] に当てはまるものを、次の (0) ~ (5) のうちから一つ選べ。
(0) LET M=N (1) LET M=P (2) LET M=X (3) LET N=M (4) LET N=P (5) LET N=X
[サ] に当てはまるものを、次の (0) ~ (3) のうちから一つ選べ。
(0) IF A=B THEN GOTO 220 (1) IF A<>B THEN GOTO 220 (2) IF A=B THEN GOTO 240 (3) IF A<>B THEN GOTO 240
(プログラム3) を実行して変数 N に 436 を入力すると、 log10(436)/log10(3) = 5.53... であることから、 110 行では P に 6 が代入され、 200 行の IF 文の判定は [シ] 回実行される。 200 行の IF 文の判定が最後に行われたときの X の値は [スセ] であり、その後、 [ソ] 。 [ソ] に当てはまるものを、次の (0) ~ (3) のうちから一つ選べ。
つまり、 N! がもつ素因数 2 の個数を求めるためには、 N から N/2 の整数部分 である M を求め、 M を改めて N と考えて、同じ手順を用いて新しく M を求める、 という手順の繰り返しを M < 2 となるまで行えばよい。この手順の繰り返しで 求められたすべての M の和が、 N! がもつ素因数 2 の個数である。
たとえば、 N = 13 の場合には、 13/2 = 6.5 であるから、 M = 6 となる。 この手順を繰り返して M を求めた結果は、 N から M を求める手順を 矢印 ( -> ) で表すと、次のようにまとめられる。
この手順にしたがって、 2 以上の自然数 N を入力して、 N! がもつ素因数 2 の 個数を出力する ( プログラム1 ) を作成した。 ただし、 INT(X) は X を超えない最大の整数を表す関数である。
39 :デフォルトの名無しさん:2014/01/24(金) 12:33:22.24
( プログラム1 )
100 INPUT PROMPT "N=" : N 110 LET D = 2 120 LET C = 0 130 LET M = N 140 FOR J = 1 TO N 150 LET M = INT(M/D) 160 LET [ウ] 170 IF [エ] THEN GOTO 190 180 NEXT J 190 PRINT "素因数"; D ; "は"; C ; "個" 200 END
ただし、繰り返し処理 「 FOR K = A TO B ~ NEXT K 」 において、 A が B より大きい場合、この繰り返し処理は実行されず次の処理に進む。
( プログラム2 )
100 INPUT PROMPT "N=" : N 110 FOR D = 2 TO N 111 FOR K = 2 TO D - 1 112 IF [ツ] THEN [テ] 113 NEXT K 120 LET C = 0 130 LET M = N 140 FOR J = 1 TO N 150 LET M = INT(M/D) 160 LET [ウ] 170 IF [エ] THEN GOTO 190 180 NEXT J 190 PRINT "素因数"; D ; "は"; C ; "個" 191 NEXT D 200 END
int getint(int m) { int n = 0; while(n < m){ write("N = ? "); try{ readf("%d", &n); if(n < m) writefln("must be greater than or equal to %d", m); }catch(ConvException){ writeln("must be integer"); n = 0; } readln(); // flush line buffer } return n; }
bool isprime(int n) { for(int k = 2; k < n; ++k){ int d = n / k; if(d * k == n) return false; } return true; }
61 :デフォルトの名無しさん:2014/01/28(火) 18:35:55.42
int main(string[] args) { int n = getint(2); writefln("N = %d", n); for(int d = 2; d <= n; ++d){ if(!isprime(d)) continue; int c = 0, m = n; for(int j = 1; j <= n; ++j){ m /= d; c += m; if(m < d) break; } writefln("(D, C) = (%6d, %6d)", d, c); } return 0; }
この手順にしたがって、自然数 M, N を入力して、 分数 M / N に対応する商の列 Q1, Q2, ..., Qk を求めるための [ プログラム 1 ] を作成した。 ただし、 INT(X) は X を超えない最大の整数を表す関数である。
[ プログラム 1 ] 100 INPUT M 110 INPUT N 120 LET Q = INT(M/N) 130 PRINT Q 140 LET R = M - Q * N [ ウ ] 150 LET M = N 160 LET N = R [ エ ] 170 IF R > 0 THEN GOTO 120 180 END
[ プログラム 2 ] 100 LET M = 1 110 LET N = 0 120 INPUT Q 130 IF Q = 0 THEN GOTO 180 140 LET R = N [ ク ] 150 LET N = M 160 LET M = Q * N + R [ ケ ] 170 GOTO 120 180 PRINT M ; "/" ; N 190 END