5000万までの素数を求めるプログラムなのですが、私の作ったプログラムは実行時間26秒くらいかかります。
先生が言うには10秒台が出るとのことですが、私は頑張っても時間を短くすることができません。
下に私の作ったプログラムを載せますので短くする方法を教えて下さい。
integer table(2:50000000),pno(50000000),cnt,m,i,j
m=sqrt(50000000.)
do 10 i=2,m
do 10 j=i*2,50000000,i
table(j)=1
10continue
do 20 i=2,50000000
if(table(i).eq.0)then
cnt=cnt+1
end if
20continue
write(6,610)cnt
610format('sosu no goukei =',i8)
end
No.1ベストアンサー
- 回答日時:
ちょっといじってみました。
integer table(2:50000000) / 499999999*0 /
integer cnt / 49999999 /
integer m
integer i, j
m=int(sqrt(50000000.))+1
do 20 i=2,m
if(i .gt. 2 .and. mod(i,2) .eq. 0 ) go to 20
if(i .gt. 3 .and. mod(i,3) .eq. 0 ) go to 20
if(i .gt. 5 .and. mod(i,5) .eq. 0 ) go to 20
if(i .gt. 7 .and. mod(i,5) .eq. 0 ) go to 20
do 10 j=i*2,50000000,i
if(table(j) .eq. 0) then
table(j)=1
cnt=cnt-1
endif
10 continue
20 continue
m=2を判定すれば偶数はすべてチェック完了でしょ。4や6のループは不要で、これだけで計算量は半減です。ついでに3や5、7位まではやっておきましょう。
then~endif構文を使うと煩雑なのでgotoにしてあります。
と思っていたら、もっとスマートなのが
do 20 i=2,m
(table(i) .eq. 0) then
do 10 j=i*2,50000000,i
if(table(j) .eq. 0) then
table(j)=1
cnt=cnt-1
endif
10 continue
endif
20 continue
こちらはどうしてうまくいくか考えてみてね
あと、まず変数はdata文や宣言文で初期化しましょう。
FORTRANの言語仕様では宣言だけした変数の値は不定で、処理系に依存します。実際は0クリアされていることが多いですが、こういうのに頼ってはいけません。
4や6のループは不要というのでわかりました。
私はk=i-(i/2)*2を使って、2以外の偶数を省くというやり方でやりました。
そしたら13秒とかなり早くなりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フローチャートの菱形が狭い。。。
-
フローチャートで 変数に代入す...
-
65536は2の何乗なのでしょうか?
-
PICマイコンのコピー(クローン...
-
exeファイルしかないプログラム...
-
C言語で、文字をbmp形式の画像...
-
binファイルってiphone専用です...
-
正しい五十音順について
-
あるフリーゲームをプレイ中に...
-
LogonUI.exe システムエラー
-
XnViewにwebpを「いつも開く」...
-
チェス 論理クイズ
-
VisualBasic2008の非ユーザーコ...
-
main関数を先頭に置くデメリット
-
GPIB制御
-
エクセルとワードをデスクトッ...
-
ウイルスセキュリティ メッセー...
-
c言語で画像から文字を認識 キ...
-
powered byの表記について
-
Webサイトの中身のプログラムを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フローチャートの菱形が狭い。。。
-
フローチャートで 変数に代入す...
-
フローチャートで。
-
クイックソートを実現するプロ...
-
C言語のプログラミングに関する...
-
TeXでフローチャート
-
for文のフローチャート
-
FORTRAN subroutineと配列と繰...
-
サブルーチンのフローチャート...
-
Fortranの倍精度実数について
-
学校でフローチャートって教わ...
-
フローチャートのループ
-
フローチャートが書けません
-
fortran90/95における計算結果...
-
フローチャートの演算記号
-
プログラムのロジックをノート...
-
fortran errorについて
-
初心者のフローチャート
-
フローチャートは作っていますか?
-
フローチャート
おすすめ情報