• 締切済み

rubyのプログラムについて

rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

  • Ruby
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

こちらで実行した所、ちゃんと(1000以下の)168個の素数が表示されましたが もしかして"invalid multibyte char"系のエラーが出てたりしますか? そのエラーの場合、原因は「素数は」という部分なので、 print "primes:\n" か何かに書き換えてあげて下さい。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

機能自体は間違いではありません。 効率とかを考えると、修正した方がいい箇所はあります。 flag=flag+1 ・約数の数を数えるのなら、有効ですが、実際には、あるか無いか、の判断にしか使っていません。 それならflag=1で十分です。 ・また、同様に全ての約数を求めるなら有効ですが、単に素数かどうかの判定だけなら、一つでも約数が存在した時点で、他の約数を検討する必要がありません。breakでwhile warukazu<i doのループから抜けていいはずです。 warukazu ・この方法の場合、2以外の偶数で割るのは、無駄です。 偶数で割り切れる=元の数は偶数=2の倍数 ですから。 ・また、 warukazu * warukazu >= i のときに判定するのは無駄です。 flag=flag+1 warukazu=warukazu+1 i=i+1 これらは、同じような計算していますが、左辺にも右辺にも同じ変数を使っています。 こういうときは、 += を使うと、1回だけ書けばいいので、楽ですし、入力間違い( warukazu=wanukazu+1 とか)も防げます アルゴリズム。 素数判定にはいろんな方法があります。 今回のような一覧表を作るなら、「ふるい」という方法があります。

関連するQ&A

  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • 小町算のプログラムについて

    小町算のプログラムについて 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

  • 十進BASICのプログラムについて

    十進BASICのプログラムについて 小町算のプログラムですが、 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

  • Rubyにおける変数

    Windows2000上で、Rubyを動かしています。 皆様のお陰で、少しずつ進んでおります。しかし、また質問させてください。 変数に、ファイル名を代入して、実行すると、動かなくなりました。 実名を入れた、system('tar zxf test_20070511.tar.gz')では、動きますが、 変数にした、system('tar zxf myFilename')では、動きません。 Rubyスクリプト ---------------------- print Dir.getwd,"\n" Dir.chdir('C:\myData\myData2') print Dir.getwd,"\n" dir = Dir.open('C:\myData\myData2') while myFilename=dir.read do if /.tar.gz/i =~myFilename then puts myFilename system('tar zxf myFilename') end end dir.close ------------------------------------ 宜しくお願いいたします。

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • BASIC言語で整数を素因数分解するプログラムを教えてください

    結果が表示されません。間違い箇所を教えてください 使用コマンドはbwbasicです 100 PRINT "N? (N>2)" 101 waru=2 102 kazuhantei=0 103 pastwaru=0 104 kaisu=1 105 hatsu=1 110 INPUT object 120 DO 130 IF object<2 THEN 140 PRINT "N? (N>2)" 150 INPUT object 160 ELSE 170 kazuhantei=1 180 END IF 190 IF kazuhantei<>0 THEN 200 GO TO 250 210 ELSE 220 GO TO 130 230 END IF 240 LOOP 250 PRINT "soinsubunkai suruto" 260 object=0 270 DO WHILE object<>1 280 IF object MOD waru=0 THEN 290 IF pastwaru=waru THEN 300 kaisu=kaisu+1 310 END IF 320 IF kaisu>1 THEN 330 PRINT "^";kaisu 335 END IF 340 kaisu=1 350 IF hatsu=0 THEN 360 PRINT "*";waru 370 pastwaru=waru 380 END IF 390 hatsu=0 400 object=object/waru 410 END IF 420 ELSE 430 waru=waru+1 440 object=object+1 445 LOOP 450 IF kaisu>1 THEN 460 PRINT "^";kaisu 465 END IF 470 END

  • rubyの誤差

    rubyのプログラムで例えば -------------------------- t=0.00 100.times do t += 0.01 print t, "\n" end -------------------------- のようなプログラムを実行したとき 0.01 0.02 0.03 ......... 0.80 0.81 0.820000000000001 0.830000000000001 ......... 0.990000000000001 1.0 と出力されたのですが、00000000000001の部分を正常に出力するにはどうすればいいのでしょうか?また、このように出力されることが丸め誤差なのでしょうか? どなたか教えてください。

    • ベストアンサー
    • Ruby
  • アカウントプログラムについて

    rubyでアカウントとパスワードを検証するプログラムを、ハッシュを使って作成しようと思っています。 そこで、if文を使って条件をわけようとしているのですが、うまくいきません。 自分なりに書いてはみたのですが間違っているようで、どこをどう直したらよいか教えていただきたいです! $KCODE = "e" hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close print "*** ログインしてください。自分のアカウント名とパスワードを入力してください。 ***\n" print "アカウント:" account = gets.chop print "パスワード:" password = gets.chop if (hash_account[account] == password) print "ようこそ、", account,"さん。それではゲームを始めましょう。\n" elsif print "パスワードが間違っているようです。\n" else print account,"というアカウントはありません。\n" end ちなみに、accountData.txtには、アカウント名、パスワードの順に入っています。

    • ベストアンサー
    • Ruby
  • ruby forkについて教えて下さい

    親プロで用意した配列の中の要素を一つづつ子プロでputsした後、最後一回、親プロで生成した子プロのPIDを確認したいです。 こんなふうに書いてみました。 #!/usr/bin/ruby table=%w(a b c d) array=[] while i=table.pop do if pid=fork then array.push pid puts pid break if table.size > 0 p array else puts i end end 実行すると、以下のような結果になりました。 $9200 c 9201 b 9202 [9202] a $ PIDが一つしか得られてません。 どうしたらよいでしょうか? ご教授の程、宜しくお願いいたします。 rubyは 1.8.7 を使ってます。 以上、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

専門家に質問してみよう