このディレクトリの索引

% 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは '100000以下のどの桁にも0を含まない削除可能素数の度数'(_度数) :- 度数('100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数),_度数). '100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数) :- まず素数候補を100000以下に絞りましょう(_素数ならび), どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数). どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数) :- どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび), 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数). まず素数候補を100000以下に絞りましょう(_素数ならび) :- '2から100000までの数ならび'(_2から100000までの数ならび), エラトステネスの篩(_2から100000までの数ならび,_素数ならび). '2から100000までの数ならび'(_2から100000までの数ならび) :- findall(N,between(2,100000,N),_2から100000までの数ならび). どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび) :- どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび). どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび) :- 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび), どの桁にも0を含まない(_削除可能素数の数字ならび). 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび) :- member(_素数,_素数ならび), number_chars(_素数,_削除可能素数の数字ならび). どの桁にも0を含まない(_削除可能素数の数字ならび) :- \+(member('0',_削除可能素数の数字ならび)). 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数) :- once(削除可能素数であるか検査する(_素数ならび,_削除可能素数の数字ならび)), number_chars(_削除可能素数,_削除可能素数の数字ならび). 削除可能素数であるか検査する(_素数ならび,[]) :- !. 削除可能素数であるか検査する(_素数ならび,L) :- ひと桁ずつ減らしていってどれも素数である(_素数ならび,L). ひと桁ずつ減らしていってどれも素数である(_素数ならび,_素数を構成する数字ならび) :- 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび), select(_,_素数を構成する数字ならび,R), 削除可能素数であるか検査する(_素数ならび,R). 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび) :- number_chars(_素数,_素数を構成する数字ならび), 素数(_素数ならび,_素数). 素数(_素数ならび,_素数) :- member(_素数,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(L1,_要素,'_要素はNで割り切れる'(_要素,N),_素数). 先頭の素数を網として篩に掛けて行く(L1,_要素,_副目標,_素数) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- エラトステネスの篩(N,R1,R2), 非決定性のエラトステネスの篩(R2,_素数). エラトステネスの篩(_,[],[]). エラトステネスの篩(N,[A|R1],L2) :- エラトステネスの篩(N,A,R2,L2), エラトステネスの篩(N,R1,R2). エラトステネスの篩(N,A,R2,R2) :- 0 is A mod N. エラトステネスの篩(N,A,R2,[A|R2]) :- \+(0 is A mod N). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- findall(_要素,( member(_要素,L1), \+(_副目標)),L2). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), エラトステネスの篩(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'(R,_1,_2),!. 'カンマ区切りで標準出力する'(_,_1,_2) :- writef('(%t,%t), ',[_1,_2]). 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(_各桁の和と乗算記号度数の一致する4桁の数ならび) :- '9999以下の素数ならび'(_9999以下の素数ならび), findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_9999以下の素数ならび,_乗算記号度数)),_各桁の和と乗算記号度数の一致する4桁の数ならび). '9999以下の素数ならび'(_9999以下の素数ならび) :- findall(N,between(2,9999,N),_2以上9999以下の数リスト), エラトステネスの篩(_2以上9999以下の数リスト,_9999以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L), エラトステネスの篩(L,R2). 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L) :- findall(N,( 'R1の残りの数ならびの中で'(R1,N), 'Mで割り切れるものは篩い落とす'(N,M)),L). 'R1の残りの数ならびの中で'(R1,N) :- member(N,R1). 'Mで割り切れるものは篩い落とす'(N,M) :- \+(0 is N mod M). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2), 各桁の合計(_下位一桁を切り取った数,_各桁の合計_2,_各桁の合計). '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2) :- M is N mod 10, _下位一桁を切り取った数 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M. 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_素数ならび,_乗算記号度数) :- 素数で何回割り切れるか(N,_素数ならび,[],_素因数の数の合計を表すならび), 素因数の数の合計を表すならびから乗算記号度数を得る(_素因数の数の合計を表すならび,_乗算記号度数). 素数で何回割り切れるか(N,[],_何回,_何回). 素数で何回割り切れるか(N,[_素数|R],_何回_1,_何回) :- 一つの素数で割ることができる数を加算する(N,_素数,_何回_1,_何回_2), 素数で何回割り切れるか(N,R,_何回_2,_何回). 一つの素数で割ることができる数を加算する(N,_素数,_何回,_何回) :- 素数で割り切れなくなったらその素数は終了する(N,_素数),!. 一つの素数で割ることができる数を加算する(N,_素数,L1,L) :- 素数で割れるだけ割っていく(N,_素数,L1,N_1,L). 素数で割り切れなくなったらその素数は終了する(N,_素数) :- \+(0 is N mod _素数). 素数で割れるだけ割っていく(N,_素数,L1,N_1,L) :- N_1 is N // _素数, 一つの素数で割ることができる数を加算する(N_1,_素数,[_|L1],L). 素因数の数の合計を表すならびから乗算記号度数を得る([_|L],_乗算記号度数) :- length(L,_乗算記号度数). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/835 # # 【課題】X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- forall('X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y), 表示しなさい(_X,_Y)). 'X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y) :- '115以下の素数ならびを得る'(_115以下の素数ならび), 組合せ(_115以下の素数ならび,2,[_X,_Y]), 115 is _X * _Y. '115以下の素数ならびを得る'(_115以下の素数ならび) :- findall(N,between(2,115,N),_2から115までの整数ならび), エラトステネスの篩(_2から115までの整数ならび,_115以下の素数ならび). 組合せ(X,1,[A]) :- member(A,X) . 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/832 # # 【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!, forall(member([_X,_Y],_X_Y_組合せならび), 表示しなさい(_X,_Y)). 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- writef('解がありません!\n'), fail. 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :- '125以下の素数ならびを得る'(_125以下の素数ならび), findall([_X,_Y],( 組合せ(_125以下の素数ならび,2,[_X,_Y]), 125 is X * Y), _X_Y_組合せならび), \+(_X_Y_組合せならび=[]). '125以下の素数ならびを得る'(_125以下の素数ならび) :- findall(N,between(2,125,N),_2から125までの整数ならび), エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび). 組合せ(X,1,[A]) :- member(A,X) . 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t %t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/777 # # 【課題】X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。 # 【 期限 】2013/10/15 # 【 Ver  】"1.7.0_11" # がんばってますが期限までに理解できる気がしないので # 基礎的なことだとは思いますが、よろしく御願いします 'X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。' :- forall('X * Y = 123 になる素数 XとYを求め、'(X,Y), '結果をすべて表示しなさい。'(X,Y)). 'X * Y = 123 になる素数 XとYを求め、'(X,Y) :- findall(N,between(2,123,N),L), エラトステネスの篩(L,_素数ならび), 重複組合せ(_素数ならび,2,[X,Y]), 123 is X * Y. '結果をすべて表示しなさい。'(X,Y) :- writef('X=%t,Y=%t\n',[X,Y]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X) . 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A) . エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # # お題:100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。 # '100以下の自然数でふたつの素数の積で表せる数を昇順にすべて表示せよ。' :- '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび), '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび), '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび). '100以下の自然数でふたつの素数の積で表せる数を'(_100までの素数ならび,_ふたつの素数の積で表せる数ならび) :- findall(_100までの自然数,( '100以下の自然数で'(_100以下の自然数), ふたつの素数の積で表せる数(_100までの自然数,_100までの素数ならび)), _ふたつの素数の積で表せる数ならび). '100以下の自然数で'(_100以下の自然数) :- between(1,100,_100以下の自然数). ふたつの素数の積で表せる数(_100以下の自然数,_100までの素数ならび) :- 組合せ(_100までの素数ならび,2,[_素数_1,_素数_2]), _100以下の自然数 is _素数_1 * _素数_2,!. '昇順にすべて表示せよ。'(_ふたつの素数の積で表せる数ならび) :- sort(_ふたつの素数の積で表せる数ならび,_整列したふたつの素数の積で表せる数ならび), atomic_list_concat(_整列したふたつの素数の積で表せる数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '100までの素数をエラトステネスの篩で求める'(_100までの素数ならび) :- findall(N,between(2,100,N),L), エラトステネスの篩(L,_100までの素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370620300/140 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # 差が6となる素数ペアをリストアップする(L) :- 整数を得る(整数x,_x), findall([_素数_1,_素数_2],( 二つの素数の差が6となる(_x,_素数_1,_素数_2)), L). 二つの素数の差が6となる(_x,_素数_1,_素数_2) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,2,[_素数_1,_素数_2]), 6 is abs(_素数_1 - _素数_2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 整数を得る/2 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), findall([_素数_1,_素数_2,_素数3],( xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3)), _3つの素数のならび), 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび). xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x,_3つの素数のならび) :- member([_素数_1,_素数_2,_素数_3],_3つの素数のならび), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 整数を得る/3 % % 注意 % % ここでは、findall/3を用いて、xが3つの素数の和で表現できる/4の全解を % 一旦ならびに取得することによって、 % その後の出力述語を決定性にすることを可能にしている。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/889 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:28日9:00 # [5] その他制限: 純粋Cライブラリ。 # # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら その三素数を出力するプログラムを作成せよ。 複数組み合わせの場合最初に見つけたものを出力せよ。'(_素数_1,_素数_2,_素数_3) :- 整数を得る(整数x,(_x >= 2,_x =< 100000),_x), xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3), 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3),!. xが3つの素数の和で表現できる(_x,_素数_1,_素数_2,_素数_3) :- findall(N,between(2,_x,N),_2から_xまでの整数ならび), エラトステネスの篩(_2から_xまでの整数ならび,_2から高々_xまでの素数ならび), 組合せ(_2から高々_xまでの素数ならび,3,[_素数_1,_素数_2,_素数_3]), _x is _素数_1 + _素数_2 + _素数_3. 'その三素数を出力せよ。'(_x,_素数_1,_素数_2,_素数_3) :- writef('%t+%t+%t = %t\n',[_素数_1,_素数_2,_素数_3,_x). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 整数を得る/3 % % % 注意 % % 「複数組み合わせの場合最初に見つけたものを出力せよ。」は述語定義できない。 % !(カット)を述語に置き換えることはできない。 % % 最初の述語の最後の ! が「複数組み合わせの場合最初に見つけたものを出力せよ。」の意味である。 % 以下のサイトは 素数生成(_素数) :- 素数生成(2,[],_素数). 素数生成(N,L,_素数) :- 素数検査(N,L,L_2,_診断), 素数生成(N,L_2,_診断,_素数). 素数検査(_素数,L,[_素数|L],素数) :- forall(member(_素数_1,L),\+(0 is _素数 mod _素数_1)),!. 素数検査(N,L,L,素数ではない). 素数生成(_素数,_,素数,_素数). 素数生成(N,L,_診断,_素数) :- N_2 is N + 1, 素数生成(N_2,L,_素数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/35 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 # 実行時にはX = 50となるように数字を入力する。 # :- dynamic(素数候補/1). :- dynamic(素数/1). '標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。実行時にはX = 50となるように数字を入力する。' :- 標準入力から正の数Xを入力し(X), '1からXまでの整数のうち、素数だけを出力する'(X). 標準入力から正の数Xを入力し(X) :- 整数を得る(正の整数X,X > 0,X). '1からXまでの整数のうち、素数だけを出力する'(X) :- 素数だけ選別する(X,_素数ならび), '1からXまでの整数のうち'(X,_整数), 素数だけ出力する(_整数,_素数ならび), X = _整数. 素数だけ選別する(X,_素数ならび) :- '2からXまでのならび'(X), エラトステネスの篩. '2からXまでのならび'(X) :- between(2,X,N), assertz(素数候補(N)), X = N. エラトステネスの篩 :- retract(素数候補(M)), assertz(素数(M)), エラトステネスの篩_1(M). エラトステネスの篩. エラトステネスの篩_1(M) :- 素数候補(N), 0 is N mod M, retract(素数候補(N)), fail. エラトステネスの篩_1(M) :- エラトステネスの篩. '1からXまでの整数のうち'(X,_整数) :- between(1,X,_整数). 素数だけ出力する(_素数,_素数ならび) :- 素数(_素数), writef('%t ',[_素数]),!. 素数だけ出力する(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/35 # # 【質問テンプレ】 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 # 実行時にはX = 50となるように数字を入力する。 # '標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 実行時にはX = 50となるように数字を入力する。' :- 標準入力から正の数Xを入力し(X), '1からXまでの整数のうち、素数だけを出力する'(X). 標準入力から正の数Xを入力し(X) :- 整数を得る(正の整数X,X > 0,X). '1からXまでの整数のうち、素数だけを出力する'(X) :- 素数だけ選別する(X,_素数ならび), '1からXまでの整数のうち'(_整数), 素数だけ出力する(_整数,_素数ならび), X = _整数. 素数だけ選別する(X,_素数ならび) :- '2からXまでのならび'(_2からXまでのならび), エラトステネスの篩(_2からXまでのならび,_素数ならび). '2からXまでのならび'(_2からXまでのならび) :- findall(N,between(2,X,N),_2からXまでのならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). '1からXまでの整数のうち'(_整数) :- between(1,X,_整数). 素数だけ出力する(_素数,_素数ならび) :- member(_素数,_素数ならび), writef('%t ',[_素数]),!. 素数だけ出力する(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/821 # # [1] 授業数学の問題をC言語で解く # [2] 問題 # 整数xを0から100000までの整数として,xが3つの素数の和で表現できるなら # その三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に # 見つけたものを出力せよ。 # [3.1] 7 # [3.2] gcc # [3.3] C # [4] 期限:25日 # [5] その他制限: 純粋Cライブラリ。 # '整数xを0から100000までの整数として,xが3つの素数の和で表現できるならその三素数を出力するプログラムを作成せよ。複数組み合わせの場合最初に見つけたものを出力せよ。'(_x) :- findall(N,between(1,100000,N),L1), エラトステネスの篩(L1,_100000以下の素数ならび), 組合せ(_100000以下の素数ならび,3,[N1,N2,N3]), _x is N1 + N2 + N3, writef('%t,%t,%t\n',[N1,N2,N3]),!. 組合せ(X,1,[A]) :- member(A,X) . 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X) . 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは # 御題 # # 1から100までの数を出力するプログラムを書け。 # ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 # 素数のときは 'Prime' と出力し、 # フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 # また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。 '1から100までの数を出力するプログラムを書け。 ただしフィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、 素数のときは ''Prime'' と出力し、 フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。' '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび), '100以下の素数を得る'(_100以下の素数ならび), between(1,100,_数), 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L), 'Nが100になるまで出力する'(N,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と、素数のときは ''Prime'' と出力し、フィボナッチ数列に現れて且つ素数の場合には ''FibPrime'' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :- 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,L), '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,L), それ以外の場合は数を(_数,L). 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :- member(_数,_100以下のフィボナッチ数ならび),!. 'フィボナッチ数列に現れる数のときは数の代わりに ''Fib'' と'(_,_,['',_,_]). '素数のときは ''Prime'' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :- member(_数,_100以下の素数ならび),!. '素数のときは ''Prime'' と'(_,_,[_,'',_]). それ以外の場合は数を(_数,['','',_数]) :- !. それ以外の場合は数を(_,[_,_,'']). '100以下のフィボナッチ数列を得る'(L) :- '100以下のフィボナッチ数列'([1,0],L). '100以下のフィボナッチ数列'([B,A|R],L) :- C is A + B, C =< 100, '100以下のフィボナッチ数列'([C,B,A|R],L),!. '100以下のフィボナッチ数列'(L,L). '100以下の素数を得る'(_100以下の素数ならび) :- findall(N,( between(1,100,N)), _1から100までのならび), エラトステネスの篩(_1から100までのならび,_100以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'Nが100になるまで出力する'(N,L) :- atomic_list_concat(L,_表示文字列), writef('%t ',[_表示文字列]), N = 100. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/345 # # [1] 授業単元: #     計算機概論 # [2] 問題文(含コード&amp;リンク): #     キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 #     ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。 # 'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数), 素数であるかを調べる(_入力された自然数). 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- write('自然数を入力してください : '), get_line(Line), '診断 :: 自然数入力'(Line,_入力された自然数),!. 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :- 'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数). '診断 :: 自然数入力'(Line,_入力された自然数) :- atom_to_term(Line,_入力された自然数,_), integer(_入力された自然数), _入力された自然数 > 0,!. '診断 :: 自然数入力'(Line,_) :- writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]), fail. 素数であるかを調べる(1) :- write('プログラムを終了します\n'),!. 素数であるかを調べる(X) :- ウィルソンの定理による素数判定(X), write('素数です\n'),!. 素数であるかを調べる(_) :- write('素数ではありません\n'). ウィルソンの定理による素数判定(X) :- X > 0, Y is X - 1, 階乗(Y,Z), 0 is (Z + 1) mod X. 階乗(_n,X) :- findall(M,between(1,N,M),L), atomic_list_concat(L,*,S), atom_to_term(S,_式,_), X is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/827 # # 単元:プログラミング1 # 問題:ある指定した値までの素数の表を出力するプログラムをかけ。 # 環境:gcc C言語 # 期限:11/20まで # # ある指定した値までの素数の表を出力する :- ある指定した値(_ある指定した値), ある指定した値までの素数の表を出力する(_ある指定した値). ある指定した値(_ある指定した値) :- 整数を得る('素数の表の上限値',_ある指定した値 > 0,_ある指定した値),!. ある指定した値までの素数の表を出力する(_ある指定した値) :- findall(N,( between(2,_ある指定した値,N)), _2からの整数ならび), エラトステネスの篩(_2からの整数ならび,_素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 素数ならびを一行に10要素ずつの表として出力する(_素数ならび) :- length(_10個の素数ならび,10), append(_10個の素数ならび,_残り素数ならび,_素数ならび), 一行出力する(_10個の素数ならび), 素数ならびを一行に10要素ずつの表として出力する(_残り素数ならび). 素数ならびを一行に10要素ずつの表として出力する(_残った素数ならび) :- 一行出力する(_残った素数ならび). 一行出力する([]). 一行出力する([A]) :- writef('%t\n',[A]),!. 一行出力する([A|R]) :- writef('%t,',[A]), 一行出力する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/425 # # [1]C言語 プログラミング # [2]http://ime.nu/codepad.org/UrZpvr24 # 制御構造について。 # 文字制限のためコードでお願いします。 # [3]Windows 7 # [3.1]vs2010 # [3.2]C言語 # [4]明日 午前中まで # [5]現在制御構造について学んでいます。 # 配列・ポインタ・関数はまだです。 # # /*問題1 # n>=m>=2を満たす整数nとmをキーボードから入力するとm進数でnを出力するプログラムを # 作成せよ。ただしm<=10としていい。表示は逆順でも良い。 # # 問題2 # 2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する # プログラムを作成せよ。ただし最後の行に素数の個数のみを表示しその他の各行には # 最後の一行を除いてちょうど10個の素数を表示しなければならない。 # 例:n=50 # 2 3 5 7 11 13 17 19 23 29 # 31 37 41 43 47 # 15 # # 問題3 # 絶対値が1未満の実数xと正の整数nが入力されるまで繰り返してキーボードからxとnを入力し # xとnが正しく入力されたら関数log(1+x)の近似値を次の式で計算して表示するプログラム。 # # log(x+1)=nΣi=1 (-1)^i+1 / i    のx^i    # # 例:n=100 x=0.5とすると0.405465と表示される。*/ '2<=n<=10000を満たす整数nをキーボードから入力すると2以上n以下の素数とその個数を表示する。ただし最後の行に素数の個数のみを表示しその他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない。' :- '2<=n<=10000を満たす整数nをキーボードから入力すると'(_n), '2以上n以下の素数とその個数を表示する'(_n). '2<=n<=10000を満たす整数nをキーボードから入力すると'(_n) :- 整数を得る('2<=n<=10000を満たす整数n',(_n >= 2,_n =< 10000),_n),!. '2以上n以下の素数とその個数を表示する。ただし最後の行に素数の個数のみを表示しその他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない。'(_n) :- '2以上n以下の素数とその個数'(_2以上n以下の素数ならび,_個数), 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(_2以上n以下の素数ならび), 最後の行に素数の個数のみを表示し(_個数). '2以上n以下の素数とその個数'(_2以上n以下の素数ならび,_個数) :- findall(N,between(2,_n,N),L), エラトステネスの篩(L,_2以上n以下の素数ならび), length(_2以上n以下の素数ならび,_個数). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(L) :- 最後の一行を除いて(L),!. 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :- atomic_list_concat([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10],',',_10個の素数), writef('%t\n',[_10個の素数文字列]). 'その他の各行には最後の一行を除いてちょうど10個の素数を表示しなければならない'(R). 最後の一行を除いて([]) :- !. 最後の一行を除いて(L) :- length(L,_要素数), _要素数 =< 10, atomic_list_concat(L,',',_10個以下の素数文字列), writef('%t\n',[_10個以下の素数文字列]),!. 最後の行に素数の個数のみを表示し(_個数) :- writef('%t\n',[_個数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/226 # # [1]C言語 繰り返し文 # [2]問題 長いのでリンクでお願いします。 # http://ime.nu/codepad.org/iaWNbokN # [3]Linux ubuntu gcc C言語 # [4]今週日曜日迄 # [5]配列 ポインタなどは習ってないですよろしくお願いします。 # # 課題1. # キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ, # その数を表示するプログラムを作成せよ.ただし,以下の条件を満たすこと. # プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も # 表示する #  次ページに記載されているサンプルプログラムよりもループ回数が少なくなるようにする # 1)サンプルプログラムでは,入力値(n) が素数の場合のループ回数は,n - 2 回になる # 2)入力値が小さい場合(n = 2, 3 など) は,ループ回数が少なくなっていなくてもよい# # #include <stdio.h> # int main(void) # { # int n, i, count = 0; # printf("n: "); # scanf("%d", &n); # for (i = 2; i * i <= n; i++) { # count++; # if (n % i == 0) { # break; # } # } # if (i * i > n) { # printf("%d: %d\n", n, count); # } # return 0; # } # # 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数), 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数). 'キーボードから2 以上の整数を1 つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する' :- 'キーボードから2 以上の整数を1つ入力し,その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する.ただし,以下の条件を満たすこと.プログラム中で,ループ回数をカウントし,入力値が素数のときにループ回数も表示する'. 'キーボードから2 以上の整数を1つ入力し'(_2以上の整数) :- 整数を得る('2以上の整数を1つ',_2以上の整数 >= 2,_2以上の整数),!. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(0) :- !. 'その数が素数(1 とその数以外で割り切れない数) のときだけ,その数を表示する'(_2以上の整数) :- 'Nは素数か'(_2以上の整数), writef('%tは素数です\n',[_2以上の整数]), fail. 'Nは素数か'(N) :- findall(M,between(2,N,M),L), 'エラトステネスの篩'(L,L2), last(L2,N),!. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/812 # # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値,!. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- \+(0 is _a mod _除数), _次の除数 is _除数 + 1, 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/191 # # 自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示すプログラムを作れ。 # 表示はコンソールに、コンマで区切って表示せよ。 # (ヒント:a,b(a<=b)の2数の積がN以下ならば最大となるaまでの素数を考えればよい) # # まずヒントが日本語じゃないです・・・ # 数学ができなくてもやる気があればできるというので大学に入ったのですが、もう毎日死ぬほど数学やってもわからない問題ばっかりです # 助けてください。毎日遊んだり合コンしたりと思ってたのに単位もらえそうになくて死にたいです # # '自然数N(N<10000)があたえられたとき、Nまでのうち素数のみを示す' :- '自然数N(N<10000)があたえられたとき'(_N), 'Nまでのうち素数のみを'(_N,_素数ならび), 示す(_素数ならび). '自然数N(N<10000)があたえられたとき'(_N) :- 自然数を得る('1000未満の自然数',_N < 1000,_N). 'Nまでのうち素数のみを'(_N,_素数ならび) :- findall(_m,( between(2,_N,_m)), L), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/835 # # ある整数型のカラムnumがあって、 # その内容が、100以下の素数であるレコードだけ抜き出すために # SQLを簡潔に書く方法はありますでしょうか # # where num=2 or num=3 or num=5 (略) num=89 or num=97 # と書いてもいいんですが、 # たとえば # where num={2,3,5,7,11,(略),83,89,97} # のようなまとめた書き方があったら教えてください # # 'ある整数型のカラムがあって、その内容が、100以下の素数であるレコードだけ抜き出す'(_カラム,_値) :- 'n以下の素数'(100,_素数ならび), テーブル(_カラム,_値), member(_カラム,_100以下の素数ならび). 'n以下の素数'(_n以下,_素数ならび) :- findall(_数,( between(2,_n以下,_数)), _2以上_n以下の数ならび), エラトステネスの篩(_2以上_n以下の数ならび,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :-!. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/104 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n個まで) :- '2から100までのリストを生成する'(L), m個目の素数は(_m個目,L,_素数), その表示をする(_m個目,_素数), _m個目 = _n個まで. '2から100までのリストを生成する'(L) :- findall(N,between(2,100,N),L). m個目の素数は(_m,L,_素数) :- 計数付きエラトステネスの篩(0,_m,L,_素数). 計数付きエラトステネスの篩(M,N,[A|R1],X) :- エラトステネスの篩(A,R1,L), 計数付きエラトステネスの篩(M,N,A,L,X). 計数付きエラトステネスの篩(M,N,A,L,A) :- N is M + 1. 計数付きエラトステネスの篩(M,N,_,L,X) :- M_2 is M + 1, 計数付きエラトステネスの篩(M_2,N,L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). その表示をする(_m個目,_素数) :- writef('%t個目の素数は %t です\n',[_m個目,_素数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/104 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- findall(N,between(2,100,N),L), 計数付きエラトステネスの篩(0,_m,L,_素数), writef('%t\n',[_素数]), _m = _n. 計数付きエラトステネスの篩(M,N,[A|R1],X) :- エラトステネスの篩(A,R1,L), 計数付きエラトステネスの篩(M,N,A,L,X). 計数付きエラトステネスの篩(M,N,A,L,A) :- N is M + 1. 計数付きエラトステネスの篩(M,N,_,L,X) :- M_2 is M + 1, 計数付きエラトステネスの篩(M_2,N,L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/104 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- findall(N,between(2,100,N),L), 計数付きエラトステネスの篩(0,_m,L,_素数), writef('%t\n',[_素数]), _m = _n. 計数付きエラトステネスの篩(M,N,[A|R1],A) :- N is M + 1, エラトステネスの篩(A,R1,L). 計数付きエラトステネスの篩(M,N,[A|R1],X) :- エラトステネスの篩(A,R1,L), M_2 is M + 1, 計数付きエラトステネスの篩(M_2,N,L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/414 # # [1] 授業単元: アルゴリズム # [2] 問題文(含コード&リンク): # 整数nを入力、2以上nイカの全ての素数およびその素数の累積を表示(while文を使用) # 例) n=15の時: # 素数:2,3,5,7,11,13 累積:41 # :- dynamic(階乗保存計算/2). '2以上n以下の素数ならび'(_n,_素数ならび,_累計) :- '2以上n以下の素数ならび'(2,_n,[2],_素数ならび,2,_累計), '2以上n以下の素数ならび'(N,_n,_素数ならび,_素数ならび,S,S) :- N > _n,!. '2以上n以下の素数ならび'(N,_n,L1,_素数ならび,S1,S) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, append(L1,[N],L2), S2 is S1 + N, '2以上n以下の素数ならび'(N2,_n,L2,_素数ならび,S2,S),!. '2以上n以下の素数ならび'(N,L1,_素数ならび,S1,S) :- N2 is N + 1, '2以上n以下の素数ならび'(N2,_n,L1,_素数ならび,S1,S). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/100 # # [1] 授業単元:C言語 # [2] 問題文 # 整数n(>=1)を入力し,nの約数の個数を返す関数int divisor(int)を用いてnが素数かどう # かを判定し,その結果を画面表示するプログラムを作成せよ. # '整数n(>=1)を入力し,nの約数の個数を返す述語を用いてnが素数かどうか判定する' :- '整数n(>=1)を入力し'(_n), 約数の個数(_n,_約数の個数), 素数かどうか判定する(_約数の個数,_判定), writef('%tは%t\n',[_n,_判定]). '整数n(>=1)を入力し'(_n) :- write('整数(>=1)を入力して下さい : '), get_line(Line), '整数n(>=1)を入力診断'(Line,_n),!. '整数n(>=1)を入力し'(_n) :- '整数n(>=1)を入力し'(_n). '整数n(>=1)を入力診断'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n >= 1,!. '整数n(>=1)を入力診断'(Line,_n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '約数の個数'(_数,_約数の個数) :- _数_1 is _数 - 1, count(( for(1,N,_数_1), 0 is _数 mod N)), _約数の個数). 素数かどうか判定する(_約数の個数,素数です) :- _約数の個数 =< 2,!. 素数かどうか判定する(_約数の個数,素数ではない). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/338 # # 急ぎなのですが # 1 考えるC # 2 整数m(mが2以上)を入力し、m以下の素数を全て表示するプログラムを作れ。 # 3 環境はlinux gcc C言語です # # 4期限は今日の夕方まで # 5進んだところは # 配列はまだやっていません # 総合問題みたいらしいです # # ぐぐればすぐサンプルがあるらしいのですが、それを使わずにかけといっていました # (簡単にかけるらしいので) # # よろしくお願いします # '整数m(mが2以上)を入力し、m以下の素数を全て表示する' :- '整数m(mが2以上)を入力し'(_m), 'm以下の素数を全て表示する'(_m). '整数m(mが2以上)を入力し'(_m) :- write('整数m(mが2以上)を入力してください : '), get_line(Line), '整数m(mが2以上)を入力診断'(Line,_m),!. '整数m(mが2以上)を入力し'(_m) :- '整数m(mが2以上)を入力し'(_m). '整数m(mが2以上)を入力診断'(Line,_m) :- atom_to_term(Line,_m,_), integer(_m), _m >= 2,!. '整数m(mが2以上)を入力診断'(Line,_m) :- writef('入力された %t からは2以上の整数が得られません。再入力をお願いします。\n',[Line]), fail. 'm以下の素数を全て表示する'(_m) :- findall(N,( for(2,N,_m)), L1), エラトステネスの篩(L1,L2), append(_,[_素数|R],L2), writef('%t\n',[_素数]), R = []. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). 表示されている1の個数を表示する :- '1000未満の素数ならび'(_素数ならび), concat_atom(_素数ならび,' ',_素数ならび表示), writef('%t\n',[_素数ならび表示]), 表示されている1の個数を表示する(_素数ならび). 表示されている1の個数を表示する(_素数ならび) :- 表示されている1の個数を表示する(_素数ならび,_1の個数), writef('数字列に含まれる1の個数は %t 個です。\n',[_1の個数]). 表示されている1の個数を表示する([],0) :- !. 表示されている1の個数を表示する([N|R],_個数) :- number_chars(N,Chars), count(member('1',Chars),_個数1), 表示されている1の個数を表示する(R,_個数2) _個数 is _個数1 + _個数2,!. '1000未満の素数ならび'(_素数ならび) :- '1000未満の素数ならび'(5,[2,3],_素数ならび). '1000未満の素数ならび'(1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(N,L1,_素数ならび) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), L1 = [M|_], ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, '1000未満の素数ならび'(N2,[N|L1],_素数ならび). '1000未満の素数ならび'(N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). '1000未満の素数ならび'(Counter,_素数ならび) :- '1000未満の素数ならび'(0,Counter,5,[2,3],_素数ならび). '1000未満の素数ならび'(Counter,Counter,1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(Counter1,Counter,N,L1,_素数ならび) :- 奇数(Counter1,Counter2,N), 既に計算済みの素数では割り切れない(Counter2,Counter3,N,L1), L1 = [M|_], ウィルソンの定理による素数判定(Counter3,Counter4,N,素数です), N2 is N + 1, append(L1,[N],L2), '1000未満の素数ならび'(Counter4,Counter,N2,L2,_素数ならび). '1000未満の素数ならび'(Counter1,Counter,N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(Counter1,Counter,N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(Counter,Counter,N,[]) :- !. 既に計算済みの素数では割り切れない(Counter1,Counter2,N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(Counter1,Counter,N,[M|R]) :- Counter2 is Counter1 + 1, 既に計算済みの素数では割り切れない(Counter2,Counter,N,R). ウィルソンの定理による素数判定(Counter1,Counter2,X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), Counter2 is Counter1 + 1, 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(Counter1,Counter2,X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), Counter2 is Counter1 + 2, \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(Counter1,Counter2,N) :- Counter2 is Counter1 + 1, 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). 各素数の各桁の和が偶数になる数のみを表示する :- '1000未満の素数ならび'(_素数ならび), 各素数の各桁の和が偶数になる数のみを表示する(_素数ならび). 各素数の各桁の和が偶数になる数のみを表示する([]). 各素数の各桁の和が偶数になる数のみを表示する([N|R]) :- number_codes(N,Codes), findsum(N2,( append(_,[N1|_],Codes), N2 is N1 - 48), Sum), 0 is Sum mod 2, write('%t ',[N]), 各素数の各桁の和が偶数になる数のみを表示する(R). 各素数の各桁の和が偶数になる数のみを表示する([_|R]) :- 各素数の各桁の和が偶数になる数のみを表示する(R). '1000未満の素数ならび'(_素数ならび) :- '1000未満の素数ならび'(5,[2,3],_素数ならび). '1000未満の素数ならび'(1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(N,L1,_素数ならび) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), L1 = [M|_], ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, '1000未満の素数ならび'(N2,[N|L1],_素数ならび). '1000未満の素数ならび'(N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/891 # # [1] C言語演習 # [2] http://ime.nu/codepad.org/Qbz0E2cP を改良して、 # 「乗除」の回数を減らすプログラムを作成しなさい。 # ただし、http://ime.nu/codepad.org/ko7MPFKI 以外の方法を使用すること。 # ,離廛蹈哀薀爐鰺用して、以下のプログラムを作成せよ。 # 1.各素数の各桁の和が偶数になる数のみを表示するプログラム # 2.表示されている1の個数を表示するプログラム # [3.1] Windows7 # [3.3] C言語 # [4] 今日の21時まで # [5]配列まで # ,呂匹里茲Δ砲靴堂鷽瑤鮓困蕕靴燭も教えていただけると幸いです。 # どうかよろしくお願いします。 # # :- dynamic(階乗保存計算/2). '1000未満の素数ならび'(_素数ならび) :- '1000未満の素数ならび'(5,[2,3],_素数ならび). '1000未満の素数ならび'(1000,_素数ならび,_素数ならび) :- !. '1000未満の素数ならび'(N,L1,_素数ならび) :- 奇数(N), 既に計算済みの素数では割り切れない(N,L1), L1 = [M|_], ウィルソンの定理による素数判定(N,素数です), N2 is N + 1, '1000未満の素数ならび'(N2,[N|L1],_素数ならび). '1000未満の素数ならび'(N,L1,_素数ならび) :- N2 is N + 1, '1000未満の素数ならび'(N2,L1,_素数ならび). 既に計算済みの素数では割り切れない(N,[]) :- !. 既に計算済みの素数では割り切れない(N,[M|R]) :- 0 is N mod M,!, fail. 既に計算済みの素数では割り切れない(N,[M|R]) :- 既に計算済みの素数では割り切れない(N,R). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/239 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 整数Nとしたとき、素数をN個リストアップするプログラムを作成しなさい。 # ※実行にあたり、Nの値を小さな値から慎重に変化させ、結果とプログラム動作の変化に注意すること # ※N=1としたとき、答えは1ではありません # '整数Nとしたとき、素数をN個リストアップする'(N,L) :- length(L,N), 素数をリストアップする([],L). 素数をリストアップする(L1,[]) :- !. 素数をリストアップする(L1,[M|R]) :- 素数を得る(M), \+(append(_,[M|_],L1)), 素数をリストアップする([M|L1],R),!. 素数をリストアップする(L1,L) :- 素数をリストアップする(L1,L),!. 素数を得る(M) :- M is random mod 4998 + 2, findall(I,for(2,I,M),L1), エラトステネスの篩(L1,L2), last(L2,M),!. 素数を得る(M) :- 素数を得る(M). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :-!. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/31 # # [1] 授業単元:繰り返し(for)・条件分岐 # [2] 問題文(含コード&リンク): # 2〜100までの数値について、素因数に分解して実行結果例のように表示するプログラムを作成しなさい。 # 例 # 2 = 素数です。 # 3 = 素数です。 # 4 = 2 × 2 # ...(省略)... # 99 = 3 × 3 × 11 # 100 = 2 × 2 × 5 × 5 # '2〜100までの数値について、素因数に分解して実行結果例のように表示する' :- _素数候補の限界値Max is truncate(sqrt(100)), findall(N1,for(2,N1,_素数候補の限界値),_素数候補), エラトステネスの篩(_素数候補,_この問題に必要な素数ならび), findall(N2,for(2,N2,100),_2〜100までの数値ならび), 素因数分解表示(_2〜100までの数値ならび,_この問題に必要な素数ならび). 素因数分解表示([],_) :- !. 素因数分解表示([N|R1],L) :- 素因数分解(N,L,L1), 素因数分解一行表示(N,L1), 素因数分解表示(R1,L),!. 素因数分解(0,_,[]) :- !. 素因数分解(N,L,[N|R3]) :- append(_,[M|L],L), 0 is N mod M, N2 is N // M, 素因数分解(N2,L,R3),!. 素因数分解(N,L,[N]). 素因数分解一行表示(N,[N]) :- writef('%t = 素数です。\n',[N]),!. 素因数分解一行表示(N,L1) :- concat_atom(L1,'×',S), writef('%t = %t\n',[N,S]),!. エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :-!. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # [15回演習問題1.1.3]エラトステネスの篩を行うプログラム、sieve/2を作れ。 # sieve(L1,L2) :- エラトステネスの篩(L1,L2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :-!. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/276 # # ゴールドバッハの予想 # 与えられた値を2つの素数の和で現してください # verは出来れば2.6で # エラトステネスのふるいを用いた素数リストを使って値を出すようにしてください # お願いします # # '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数組ならび) :- findall([_素数_1,_素数_2],( '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2)), _素数組ならび). '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2) :- ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび), 素数ならびの生成(_数値ならび,_素数ならび), 素数の和(_与えられた値,_素数ならび,_素数_1,_素数_2). ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび) :- findall(N,for(2,N,_与えられた値),_数値ならび). 素数ならびの生成(_数値ならび,_素数ならび) :- エラトステネスの篩(_数値ならび,_素数ならび). 素数の和(_与えられた値,[N|R1],_素数_1,_素数_2) :- _素数_2 is _与えられた値 - N, _素数_2 =< N, !,fail. 素数の和(_与えられた値,[_素数_1|R1],_素数_1,_素数_2) :- _素数_2 is _与えられた値 - _素数_1, append(_,[_素数_2|_],R1). 素数の和(_与えられた値,[_|R1],_素数_1,_素数_2) :- 素数の和(_与えられた値,R1,_素数_1,_素数_2). % *** user: エラトステネスの篩 / 3 *** エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % *** user: エラトステネスの篩 / 2 *** エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/286 # # [1] 授業単元: C # [2] 問題文(含コード&リンク): # エラトステネスの篩 # 第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、 # 配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数 # int eratosthenes(int m, intP[]) # を作成せよ。 # なお、格納した素数の個数がhの場合、素数の配列PのP[0]からP[h-1]に昇順に # 格納されているものとする。 # 'エラトステネスの篩 第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数'(_m,_格納した素数の個数) :- findall(N,for(2,N,_m),L), エラトステネスの篩(L,_P), length(_P,_格納した素数の個数). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (3)1から1000までにある素数を全て出力するプログラム。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # '1から1000までにある素数を全て出力する' :- 素数生成(1000,L), append(_,[_素数|R],L), write_formatted('%t\n',[_素数]), R = []. 素数生成(N,L) :- findall(M,for(2,M,N),L1), エラトステネスの篩(L1,L). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/636 # # [1] プログラミングC # [2] 5000以下の素数を1行に10個ずつ、画面に出力するC言語のプログラムを作成しなさい。 # '5000以下の素数を1行に10個ずつ、画面に出力する' :- '5000以下の素数を'(_5000以下の素数), '1行に10個ずつ、画面に出力する'(_5000以下の素数). '5000以下の素数を'(_5000以下の素数) :- 素数生成(5000,_5000以下の素数). 素数生成(N,X) :- findall(M,for(2,M,N),L), エラトステネスの篩(L,X). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). '1行に10個ずつ、画面に出力する'([]) :- !. '1行に10個ずつ、画面に出力する'(L) :- length(L0,10), append(L0,R,L), concat_atom(L0,',',S), write_formatted('%t\n',[S]), '1行に10個ずつ、画面に出力する'(R),!. '1行に10個ずつ、画面に出力する'(L) :- concat_atom(L,',',S), write_formatted('%t\n',[S]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/781 # # こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 # [1] 授業単元: C基礎 # [2] 問題文(含コード&リンク): # 問題2 キーボードから正の整数を1つ入力しその数が素数であるかを判定するプログラムを # for文 break文などを用いて作成せよ # % http://nojiriko.asia/prolog/c140_625.html キーボードから正の整数を1つ入力しその数が素数であるかを判定する :- キーボードから正の整数を1つ入力し(_正の整数), ウィルソンの定理による素数判定(_正の整数,_診断), write_formatted('%t\n',[_診断]). 正の整数を1つ入力し(_正の整数) :- get_line(Line), 正の整数の入力診断(Line,_正の整数),!. 正の整数を1つ入力し(_正の整数) :- 正の整数を1つ入力し(_正の整数). 正の整数の入力診断(Line,_正の整数) :- atom_to_term(Line,_正の整数,_), integer(_正の整数), _正の整数 >= 0,!. 正の整数の入力診断(Line,_正の整数) :- write_formatted('入力された %t から正の整数はえられませんでした。再入力をお願いします。\n',[Line]), fail. ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/502 # # 最後です # よろしくお願いします。 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 素数の総和の計算 2+3+5+…+n+… のとき、総和が初めて9129 以上になる素数nを求めよ # '素数の総和の計算 2+3+5+…+n+… のとき、総和が初めて9129 以上になる素数nを求めよ'(_n) :- for(2,_n,maxint), 素数生成(_n,L), sum(L,Sum), Sum > 9129,!. 素数生成(N,X) :- for(2,M,N), エラトステネスの篩(M,L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/625 # # [1] 授業単元:C++ベーシック # [2] 問題文(含コード&リンク): 1~100までの素数を探し、そのすべての素数とその値を合計を表示するプログラムを作成しなさい。 # '1~100までの素数を探し、そのすべての素数とその値の合計を表示する' :- findsum(N,( '1~100までの素数を探し、その全ての素数と'(N)),_素数の合計), その値の合計を表示する'(_素数の合計). '1~100までの素数を探し、その全ての素数と'(N) :- between(1,100,N), ウィルソンの定理による素数判定(N,素数です), writef('%w\n',[N]). ウィルソンの定理による素数判定(X,素数です) :- 正の整数でその数より1小さい数の階乗に1を加えた数がその数で割り切れたらその数は素数である(X). ウィルソンの定理による素数判定(X,素数ではありません) :- 正の整数でその数より1小さい数の階乗に1を加えた数がその数で割り切れなかったらその数は素数ではない(X). 正の整数でその数より1小さい数の階乗に1を加えた数がその数で割り切れたらその数は素数である(X) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. 正の整数でその数より1小さい数の階乗に1を加えた数がその数で割り切れなかったらその数は素数ではない(X) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). その値の合計を表示する(_素数の合計) :- writef('合計は %w です\n',[_素数の合計]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/678 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 以下の機能を持つプログラムを作ること。 # # -1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不 # 可) # -抽出した素数を大きい順(降順)にソートする # -ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する) # # 以下の点に関して工夫をした場合は加点の対象とする # # -素数の計算時間の低減 # -見つけた素数の数のカウント # -ソートのアルゴリズム高速化 # -実行時間の表示 # # 作成したプログラムの特徴を提出時のコメントに記入すること # (素数の見つけ方、ソートの仕方、表示方法での工夫など) # '1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不可)-抽出した素数を大きい順(降順)にソートする-ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する)' :- '1から100の数字の中から素数を抽出する'(L1), '抽出した素数を大きい順(降順)にソートする'(L1,L2), 'ソートした素数を1行につき5個表示する'(L2). '1から100の数字の中から素数を抽出する'(L1) :- findall(M,for(2,M,N),L),'エラトステネスの篩'(L,L1),!. '抽出した素数を大きい順(降順)にソートする'(L1,L2) :- sort(L1,L3),reverse(L3,L2). 'ソートした素数を1行につき5個表示する'(L) :- '5個切り取り表示'(L,R), length(R,Len), Len < 5, '最終行は5個に満たないかもしれない(R),!. '5個切り取り表示'(R,R) :- length(R,Len),Len < 5,!. '5個切り取り表示'(L,R) :- 'N個組'(5,L,X,R), concat_atom(X,' ',S1), write_formatted('%t\n',[S1]). 'N個組'(N,L,X,R) :- length(X,N), append(L0,X,R,L), length(L0,Len1), 0 is Len1 mod N. 最終行は5個に満たないかもしれない(R) :- concat_atom(R,' ',S),write_formatted('%t\n',[S]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/254 # # [1] 授業単元:情報処理学 # [2] 問題文(含コード&リンク): # do-while文を用いて、キーボードから入力された値が素数であるかどうかを # 判別するプログラムを作成せよ。入力された値が素数の場合は"素数"と出力し、 # 素数でない場合は最小の因数を出力せよ。 # キーボードから入力された値が素数であるかどうかを判別する :- get_integer(N), 素数であるかどうかを判別する(N). 素数であるかどうかを判別する(N) :- 素数ではない(N,_最小因子), write_formatted('%tは素数ではありません。最小因子は%tです。\n',[N,_最小因子]),!. 素数であるかどうかを判別する(N) :- write_formatted('%tは素数です。\n',[N]). 素数ではない(N,_最小因子) :- N2 is N // 2, for(2,M,N2), 0 is N mod M, _最小因子 = M,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/907 # # [2] 問題文(含コード&リンク): ある整数を入力し,それより小さい素数をすべて表示するプログラムを作成しなさい. ある整数を入力し,それより小さい素数をすべて表示する :- write('整数を入力してください : '), get_integer(N), N1 is N - 1, 素数生成(N1,L), concat_atom(L,',',S), write_formatted('%tより小さいすべての素数は %t です\n',[N,S]). 素数生成(N,X) :- findall(M,for(2,M,N),L), エラトステネスの篩(L,X). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/454 # # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm 822.txt # # (1) 入力された正の整数が素数であるか判定するプログラムを作成する。 # ただし、機能は以下のように実現するものとする。 # boolean 型の戻り値をもつメソッド isPrime は引数に正の整数をとり、 # 素数なら true を返し、そうでないなら false を返す。 # main メソッドから、isPrime を呼び出すようにせよ。 # # (2)入力された正の整数が素数であるか判定し、素数でない場合は最少の素因数を # 出力するプログラムを作成する。ただし、機能は以下のように実現するものとする。 # int 型の戻り値をもつメソッド minimumDivisor は引数に正の整数をとり、 # 素数なら0 を返し、そうでないなら最小の素因数を返す。 # main メソッドから、minimumDivisor を呼び出し、戻り値に応じた出力をすようにせよ。 % (1) program :- user_parameters([A]), atom_to_term(A,N,_), isPrime_test(N,_診断), write_formatted('%t\n',[_診断]). isPrime_test(N,true) :- isPrime(N). isPrime_test(N,false) :- \+(isPrime(N)). isPrime(1) :- !. isPrime(N) :- \+((for(2,M,N//2),0 is N mod M)),!. % (2) program :- user_parameters([A]), atom_to_term(A,N,_), minimumDiviso(N,_診断), write_formatted('%t\n',[_診断]). minimumDiviso(1,0) :- !. minimumDiviso(N,M) :- for(2,M,N//2),0 is N mod M,!. minimumDiviso(N,0). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/436 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9949.txt # 1. double x[3],y[3](成分はscanf)の内積を求めるプログラム # 2. 数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示するプログラム # 3. 「正数を入力してください」と表示し、入力した数字nが素数かどうかを # 判断するプログラム 内積([],[],0). 内積([A|R1],[B|R2],X) :- 内積(R1,R2,Y), C is A * B, X is Y + C. '数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示する'(Max,X) :- findsum(Y,( between(1,Max,N), Y is 2 ^ N)), X). 素数かどうか判断する :- write('正数を入力してください : '), repeat, get_line(Line), atom_to_term(Line,N,_), integer(N), N > 0, 素数である(N),!. 素数である(N) :- N2 is N // 2, for(2,M,N2), 0 is N mod M, !, fail. 素数である(_). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % *** user: findsum / 3 *** findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), '加算'(_値ならび,_合計値),!. % *** user: 加算 / 2 *** 加算(trunc(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL),!. 加算(四捨五入(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!. 加算(切捨て(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!. 加算(切り上げ(L),SL) :- 加算(L,SL2), findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!. 加算([],L) :- var(L), L = 0.0e+00,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 行列の転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). % *** user: 加算の変数に零をおく / 1 *** 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % *** user: 加算_1 / 3 *** 加算_1([],S,S) :- !. 加算_1([A|R],Y,S) :- ならび(A), ならび(Y), !, ならび加算(A,Y,Z), 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, 加算_1(R,Z,S),!. 加算_1([A|R],Y,S) :- atom(A), 加算_1(R,Y,S),!. 加算_1([A|R],Y,S) :- A1 は A, Z is A1 + Y, 加算_1(R,Z,S). 加算_1(A,Y,S) :- とからりすと(A,L), !, 加算_1(L,Y,S). % *** user: 加算_2 / 2 *** 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). % *** user: 行列の転置 / 3 *** 行列の転置([],[],[]) :- !. 行列の転置([[A|R]|R1],[A|R2],[R|R3]) :- 行列の転置(R1,R2,R3). % *** user: 行列の転置 / 2 *** 行列の転置([[]|_],[]) :- !. 行列の転置(L,[B|R1]) :- 行列の転置(L,B,R2), 行列の転置(R2,R1),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #236 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # 任意の数xの例で説明すると(x-1)!+1 がもしxで割り切れるならばxは素数であると # 言え、割り切れないならばxは、素数ではないと言える。 # このような素数を判別することができる定理をウィルソンの定理と呼ぶ。 # # 入力した値の階乗を求めるプログラム(4桁まで対応)を改良して、ウィルソン # の定理による素数判定を実装せよ。 # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9928.txt # # 素数ならば素数です。素数でないならば素数ではありません。と表示しなさい。 :- dynamic(階乗保存計算/2). ウィルソンの定理による素数判定(X,素数です) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod X,!. ウィルソンの定理による素数判定(X,素数ではありません) :- X > 0, Y is X - 1, 階乗保存計算(Y,Z), \+(0 is (Z + 1) mod X),!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # # エラトステネスの篩による素数生成 # 素数生成(N,X) :- findall(M,for(2,M,N),L), エラトステネスの篩(L,X). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは mからnの範囲の素数(_m,_n,_mから_nの範囲の素数ならび) :- n以下の素数(_n,_n以下の素数ならび), findall(_素数,( member(_素数,_n以下の素数ならび), _素数 >= _m), _mから_nの範囲の素数ならび). n以下の素数(_n以下,_素数ならび) :- findall(_数,( between(2,_n以下,_数)), _2以上_n以下の数ならび), エラトステネスの篩(_2以上_n以下の数ならび,_素数ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([_或る素数|R1],[_或る素数|R2]) :- 或る素数の倍数を篩に掛ける(_或る素数,_或る素数,[_或る素数|R1],L), エラトステネスの篩(L,R2). 或る素数の倍数を篩に掛ける(_,_,[],[]). 或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数|R1],R2) :- _或る素数の倍数_2 is _或る素数の倍数 + _或る素数, 或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,R1,R2),!. 或る素数の倍数を篩に掛ける(_或る素数の倍数_1,_或る素数,[_数|R1],R2) :- _或る素数の倍数_1 < _数, _或る素数の倍数_2 is _或る素数の倍数_1 + _或る素数, 或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,[_数|R1],R2),!. 或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数ではない数|R1],[_或る素数の倍数ではない数|R2]) :- 或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,R1,R2),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([_或る素数|R1],[_或る素数|R2]) :- 或る素数の倍数を篩に掛ける(_或る素数,_或る素数,[_或る素数|R1],L), エラトステネスの篩(L,R2). 或る素数の倍数を篩に掛ける(_,_,[],[]). 或る素数の倍数を篩に掛ける(_或る素数の倍数,_或る素数,[_或る素数の倍数|R1],R2) :- _或る素数の倍数_2 is _或る素数の倍数 + _或る素数, 或る素数の倍数を篩に掛ける(_或る素数の倍数_2,_或る素数,R1,R2),!. 或る素数の倍数を篩に掛ける(_或る素数の次の倍数,_或る素数,[_数|R1],R2) :- 数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_数|R],R2). 数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_数|R1],R2) :- _或る素数の次の倍数 < _数, _或る素数の次の次の倍数 is _或る素数の次の倍数 + _或る素数, 或る素数の倍数を篩に掛ける(_或る素数の次の次の倍数,_或る素数,[_数|R1],R2),!. 数が或る素数の次の倍数ではない場合は(_或る素数の次の倍数,_或る素数,[_或る素数の倍数ではない数|R1],[_或る素数の倍数ではない数|R2]) :- 或る素数の倍数を篩に掛ける(_或る素数の次の倍数,_或る素数,R1,R2),!. % 以下のサイトは 'エラトステネスの篩とは、古代数学者が素数判定法の一種で、 古代数学者エラトステネスが考案したことが記されているためこの名がある。 2以上N以下の順序数の集合から素数と解ったものの倍数を篩に掛けるように 削除していって、すべての要素を検査し終わるまで、すなわち 素数以外の要素がなくなるまでこれを繰り返す。こうして素数集合得るものである。 述語名はこれ以後、"エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)"と 簡約する'(_Nまで,_素数ならび) :- '2以上N以下の順序数集合'(_Nまで,_2以上N以下のの順序数ならび), 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(_2以上N以下の順序数ならび,_素数ならび). 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([],[]) :- !. 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([A|R1],[A|R2]) :- 篩は素数の倍数で篩に掛けるものとする(R1,A,L), 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(L,R2). 篩は素数の倍数で篩に掛けるものとする(R1,A,L) :- findall(B,( member(B,R1), \+(0 is B mod A)), L). '2から始める順序数集合'(_Nまで,_2からNまでの順序数ならび) :- findall(M,between(2,_Nまで,M),_2からNまでの順序数ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mからnの範囲の素数(_m,_n,_mから_nの範囲の素数ならび) :- n以下の素数(_n,_n以下の素数ならび), findall(_素数,( member(_素数,_n以下の素数ならび), _素数 >= _m), _mから_nの範囲の素数ならび). n以下の素数(_n以下,_素数ならび) :- findall(_数,( between(2,_n以下,_数)), _2以上_n以下の数ならび), エラトステネスの篩(_2以上_n以下の数ならび,_素数ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([_ある素数|R1],[_ある素数|R2]) :- ある素数の倍数を篩に掛ける(_ある素数,_ある素数,[_ある素数|R1],L), エラトステネスの篩(L,R2). ある素数の倍数を篩に掛ける(_,_,[],[]). ある素数の倍数を篩に掛ける(_ある素数の倍数,_ある素数,[_ある素数の倍数|R1],R2) :- _ある素数の倍数_2 is _ある素数の倍数 + _ある素数, ある素数の倍数を篩に掛ける(_ある素数の倍数_2,_ある素数,R1,R2),!. ある素数の倍数を篩に掛ける(_ある素数の倍数_1,_ある素数,[_数|R1],R2) :- _ある素数の倍数_1 < _数, _ある素数の倍数_2 is _ある素数の倍数_1 + _ある素数, ある素数の倍数を篩に掛ける(_ある素数の倍数_2,_ある素数,[_数|R1],R2),!. ある素数の倍数を篩に掛ける(_ある素数の倍数,_ある素数,[_ある素数の倍数ではない数|R1],[_ある素数の倍数ではない数|R2]) :- ある素数の倍数を篩に掛ける(_ある素数の倍数,_ある素数,R1,R2),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([_素数|R1],[_素数|R2]) :- last([_素数|R1],_R1の最終数), 素数の倍数を篩に掛ける(_R1の最終数,_素数,R1,L), エラトステネスの篩(L,R2). 素数の倍数を篩に掛ける(_R1の最終数,_素数,R1,L) :- findall(U,( 素数の倍数を取る(_R1の最終数,_素数,2,U), ( U > _R1の最終数,!,fail; \+(member(U,R1)))), L). 素数の倍数を得る(M,N,X) :- X is M * N. 素数の倍数を得る(M,N,X) :- N_2 is N + 1, 素数の倍数を得る(M,N_2,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2) . エラトステネスの篩(_,_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- '_要素がNの倍数の時篩に掛かる'(N,A,R1,R2),!. エラトステネスの篩(N,[_|R1],[A|R2]) :- '_要素がNの倍数でない時は残る'(N,R1,R2). '_要素がNの倍数の時篩に掛かる'(N,A,R1,R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2). '_要素がNのでない時は残る'(N,R1,R2) :- エラトステネスの篩(N,R1,R2) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- A_2 is A + A, エラトステネスの篩(A,A_2,R1,L), エラトステネスの篩(L,R2) . エラトステネスの篩(N,N_1,L1,L2) :- select(N_1,L1,L3), N_2 is N_1 + N, エラトステネスの篩(N_2,L3,L2). エラトステネスの篩(N,N_1,L1,L2) :- N_2 is N_1 + N, エラトステネスの篩(N_2,L1,L2) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% n以下の素数(_n以下,_素数ならび) :- findall(_数,( between(2,_n以下,_数)), _2以上_n以下の数ならび), Max is truncate(sqrt(_n以下)), エラトステネスの篩(Max,_2以上_n以下の数ならび,_素数ならび). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(Max,[A|R1],[A|R2]) :- 或る数の倍数を削除する(Max,A,R1,L), エラトステネスの篩(Max,L,R2). 或る数の倍数を削除する(Max,A,L1,L) :- findall(U,( member(B,L1), 或る数の倍数と一致しない(Max,A,B)), L). 或る数の倍数と一致しない(Max,_或る数,B) :- 或る数の倍数を生成する(_或る数,_倍数), ( _倍数 > Max, B = _倍数,! ; _倍数 > Max,!,fail). 或る数の倍数を生成する(_或る数,_倍数) :- 或る数の倍数を生成する(2,_或る数,_倍数). 或る数の倍数を生成する(N,_或る数,_倍数) :- _倍数 is _ある数 * (N + 1). 或る数の倍数を生成する(N,_或る数,_倍数) :- N_2 is N + 1, 或る数の倍数を生成する(N_2,_或る数,_倍数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- 'R1から、Aの倍数である要素を篩い落とし、Aの倍数ではない要素だけを残す'(R1,A,L), エラトステネスの篩(L,R2). 'R1から、Aの倍数である要素を篩い落とし、Aの倍数ではない要素だけを残す'(R1,A,L) :- findall(B,( member(B,R1), \+(0 is B mod A)), L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- findall(B,(member(B,R1),\+(0 is B mod A)),L), エラトステネスの篩(L,R2). % 以下のサイトは 'エラトステネスの篩とは、素数判定法の一つで、 古代数学者エラトステネスが考案したことが記されているためこの名がある。 2以上N以下の順序数の集合から素数と解ったものの倍数を篩に掛けるように 削除していって、すべての要素を検査し終わるまで、すなわち 素数以外の要素がなくなるまでこれを繰り返す。こうして素数集合を 得るものである。 なお、述語名はこれ以後、 "エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)"と 簡約する'(_N以下,_N以下の素数ならび) :- 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)により、N以下の素数ならびを得る'(_N以下,_N以下の素数ならび). 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)により、N以下の素数ならびを得る'(_N以下,_N以下の素数ならび) :- '2以上N以下の順序数集合'(_Nまで,_2以上N以下の順序数ならび), 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(_2以上N以下の順序数ならび,_N以下の素数ならび). 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([],[]) :- !. 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([A|R1],[A|R2]) :- 篩は素数の倍数で篩に掛けるものとする(R1,A,L), 'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(L,R2). 篩は素数の倍数で篩に掛けるものとする(R1,A,L) :- findall(B,( member(B,R1), \+(0 is B mod A)), L). '2以上N以下の順序数集合'(_N以下,_2からNまでの順序数ならび) :- findall(M,between(2,_N以下,M),_2からNまでの順序数ならび).