#include <stdio.h> |
キー入力した整数 a の値の平方根の近似値を、所望の精度で計算する左記のプログラムを完成せよ。
|
☆ a' ≦ a ≦ a" である a' を a の下界(lower bound)、a" を a の上界(upper bound)という。
a' ≦ a ≦ a" かつ a' ≦ y ≦ a" ならば a' - a" ≦ y - a ≦ a" - a' すなわち |y - a| ≦ a" - a'。
☆ 例外処理は省略。//if(a <= 0 || eb <= 0){return 0;}
☆ まず a == 2 の数値例で考える。
#include <stdio.h> |
2 の平方根を計算して表示する左記のプログラムを完成せよ。
|
☆ 1*1 < 2 < 2*2 (1 + 2)/2 = 3/2 9/4 > 2
1 < 2 < 9/4 (1 + 3/2)/2 = 5/4 25/16 < 2
25/16 < 2 < 9/4 (5/4 + 3/2)/2 = 11/8 121/64 < 2
121/64 < 2 < 9/4 (11/8 + 3/2)/2 = 23/16 529/256 > 2
121/64 < 2 < 529/256 (11/8 + 23/16)/2 = 45/32 2025/1024 < 2
1.40625 = 45/32 < sqrt(2) < 23/16 = 1.4375
★ 2分法による近似計算(ニュートン法に比べて収束が遅い)
while(1){ |
<* y*y ≒ 2 である y を計算 *>
|
☆ 他の a でも同様。
① a == 5 のときの lb, ub の初期値は?
② a の立方根の計算法は ?
#include <stdio.h> |
キー入力した年、月のカレンダーを表示する左記のプログラムを完成せよ。
|
☆ 2000 年 1 月 1 日は土曜日。
☆ year 年がうるう年ならば 1、そうでなければ 0 となる式は
year%400 == 0 || (year%100 > 0 && year%4 == 0)
int m[13]={0, 1, -2, 1, 0, 1, 0, |
<* その他の宣言 *> |
n%400 == 0 || n%100 != 0 && n%4 == 0 |
<* n は閏年 *> |
n = 2000; y = 6; |
<* year年month月1日の曜日を計算 *> |
☆ 関数を学べば 「u = <* n は閏年 *>;」は「u = uruu(n);」
printf(" 日 月 火 水 木 金 土\n"); |
<* カレンダーを画面に表示 *> |
☆
#include <stdio.h> |
配列 a[8] のデータを小さい順に並べる次のプログラムを完成せよ。 |
☆ 次のように処理したい(マージソート)。
(7)(2)(5)(1)(4)(9)(6)(3)
(2, 7)(1, 5)(4, 9)(3, 6)
(1, 2, 5, 7)(3, 4, 6, 9)
(1, 2, 3, 4, 5, 6, 7, 9)
☆ (4, 9)(3, 6) から (3, 4, 6, 9) を作るとき a[i](i = 4, 5)と a[j](j = 6, 7)の小さい方を b[k](k = 4, 5, 6)にする。
(1) 「a[4] > a[6]」 だから 「b[4] = a[6];」
(2) 「a[4] < a[7]」 だから 「b[5] = a[4];」
(3) 「a[5] > a[7]」 だから 「b[6] = a[7];」
(4) a[j] 側に残りが無いから 「b[7] = a[5];」
int i, j, k; |
<* a[k](n*m≦k<n*m+n)を並べ替えて b[k] に *> |
☆
int i, j, k, n2, mn ; |
<* その他の宣言 *> |
n2 = n/2; mn = m*n; |
while(<* a[i], a[j] に残りがある *>) |
if(a[i] < a[j]){ |
<* a[i], a[j] の小さい方を b[k]にして、i, j, k を更新 *> |
while(i < mn+n2){ |
<* b[k] に残りをコピー *> |
☆
#include <stdio.h> |
与えられた集合の要素を並べた順列を辞書式に配列する左記のプログラムを完成せよ。
|
☆ 順列 α 、β について、辞書式配列で α の方が β より前にあれば α < β と考える。
最小の順列は "012345"、最大の順列は "543210" である。
☆ 順列 "312540" の直後の順列 "314025" は次のようにして得られる。
(1) {'5', '4', '0'}の中で '2' の次に小さい '4' を選ぶ。
(2) "314" の後に "520" を付ける。
(3) "520" を反転して "025" にする。
for(k = n-1; k >= 0; k--){ |
if(<* 表示順列は最大 *>) break; |
for(i = n; i > k; i--){ |
<* 直後の順列を求める *> |
for(i = 0; i < (n-k)/2; i++){ |
<* s[i]からs[n]までを小さい順に *> |
☆ 応用例(s[ ]="0123456789")
3094*7=21658
3907*4=15628
4093*7=28651
5694*3=17082
5817*6=34902
6819*3=20457
6918*3=20754
7039*4=28156
8169*3=24507
9127*4=36508
9168*3=27504
9304*7=65128
9403*7=65821
☆ 応用例(s[ ]="123456789": if(s[0] != '0'){continue;}で共用)
5/34+7/68+9/12=1
5/34+9/12+7/68=1
7/68+5/34+9/12=1
7/68+9/12+5/34=1
9/12+5/34+7/68=1
9/12+7/68+5/34=1
※コメント投稿者のブログIDはブログ作成者のみに通知されます