ここから本文です

解決済みの質問

Javaで素数の表を作りたいです。

dentro_de_minさん

Javaで素数の表を作りたいです。

Javaの課題で頭を悩ませております。
1から10までの数字を横に並べて、1だけ色を青にして、素数である2、3、5、7・・・は赤色を塗る、といったJavaプログラムを実行するにはどうすればよいのでしょうか?

添付した画像のような感じにしたいのですが・・・
とりあえず1から10まで数字を並べることはできたので、記載します。


import java.applet.*;
import java.awt.*;

public class sosuu extends Applet {
public void paint(Graphics g){
String sosuu = "";
int xPosition = 10, yPosition = 60;
for(int i=1; i<=10; i++){
sosuu = sosuu + i;
}
g.drawString(sosuu, xPosition, yPosition);
}
}


数字の間隔も、もう少し広げたいです。
よろしくお願いします(>_<)

補足
必要はありますね。単に2、3、5、7を素数として赤くするNGでして…並べることはできた↓
http://onnsei-okiba.radilog.net/article/479078.html
と思うのですが…素数判定のメソッドは、ここ↓
http://www.tsg.ne.jp/text/2004/c/mansaku/P01.html
とか参考にしたのですが、やっぱりうまく書けません(>_<)

投稿画像

違反報告

ベストアンサーに選ばれた回答

katsuragihiroshiさん

とりあえず作りましたので、参考にしてください。

//エラトステネスの篩(ふるい)により素数を求める
// 1 から 200 までの整数を表示し、"エラトステネスのふるい"の方法で,
// 2の倍,3の倍数,5の倍数,7の倍数-------を順次画面からふるい 落とす
// 最後の画面に残った赤い数字が素数

import java.awt.*;
import java.awt.event.*;

public class Sosuu extends Frame {
static final int N=200;
int k,x,y; // (x,y) は 数字の表示位置

public Sosuu() {
setTitle("エラトステネスの篩(ふるい)により素数を求める");
setLocation(170,0);
setBackground(Color.WHITE);

//画面を閉じるための処理
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public void paint(Graphics g) {
Font f=new Font("MS 明朝",Font.BOLD,12);
g.setFont(f); // フォントの設定
g.setColor(Color.red);// 数字を赤で表示
//初めはすべて赤字で表示
for (int i=0; i<20; i++) {
for (int j=1; j<=10; j++) {
x=10+50*j;
y=100+i*25;
int k;
k=10*i+j;

// 数字を揃えて表示するための操作
// subString(int beginindex, int endindex)は部分文字列を返す
// beginindexは取りだす最初の文字位置、endindexは取りだす最後の文字位置
String str = " "+k;
str =str.substring(str.length()-4,str.length());
g.drawString(str,x,y);
}
}

//素数でないものを青字で表示
k=(int)Math.sqrt(N);// N までの素数を求めるとき, sqrt(N)までの数の
// 倍数であるかどかを調べれば十分
g.setColor(Color.blue);//素数でない 数を青で表示
String str = new String();
//1は素数でないので除く
str = " 1";
str =str.substring(str.length()-4,str.length());
g.drawString(str,60,100);

for (int i=2; i<=k; i++) {
int n=i; //iの整数倍
int nn=0;//iの倍数を作るのために
while(n<=N){//N以下の時続ける
x=60+50*((n-1)%10); //横の位置
y=100+25*((n-1)/10);//縦の位置
//初めてでてきた数値は素数、それ以外は素数でない
if(n != i){
str = " "+n;
str =str.substring(str.length()-4,str.length());
g.drawString(str,x,y);
}
n=i*(++nn);
}
}
}

public static void main(String[] args) {
//インスタンスの生成
Sosuu so=new Sosuu();
//画面のサイズ
so.setSize(630,650);
//描画(つまりpaint()を呼ぶ)
so.setVisible(true);
}
}

質問した人からのコメント

  • 降参>katsuragihiroshiさん
    ありがとうございます!
    「エラトステネスの篩」って、何かカッコいいですね!

    >komi55888さん
    すいません、以後気をつけます(>_<)
    リンク先ありがとうございます!

    >bear52502278さん
    ありがとうございます!
    ただ、私のコードのどの部分にbear52502278さんが書いてくださったコードを入れてみても、うまく動作しなかったんですよね・・・はぁ、勉強不足です(>_<)
  • コメント日時:2009/11/14 18:04:26

グレード

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

ベストアンサー以外の回答

(2件中1〜2件)

並べ替え:回答日時の
新しい順
古い順

 

komi55888さん

ご質問からは、プログラムでの素数判定はしなくてよさそうにも読めるのですが。素数判定もプログラムでやる必要があるのでしょうか、ないのでしょうか?

> g.drawString(sosuu, xPosition, yPosition);

これで「1から10まで数字を並べることはできた」というのはおかしいです。数字が同じ場所に重ね書きされただけなのでは?
「java drawString」で検索して、引数の意味を調べてみてください。

--

補足を受けての追記。
sosuuはString型でしたか。見間違えていました。これだと12...90という文字列を1つ表示するだけですね。そうではなくて、一つ一つの数字をバラバラに表示できるように書き換えてみてください。下記サイトあたりが参考になるでしょう。
http://www.javadrive.jp/applet/graphics/index.html

素数判定についてはすでに回答がついているようなので省略します。なお「うまく書けません」だけでは何がうまくいかないのか分からず、回答側も答えようがないので、何がどううまくいかないのか、質問時にきちんと書くことをお勧めします。

  • 違反報告
  • 編集日時:2009/11/9 01:38:06
  • 回答日時:2009/11/7 22:20:07

bear52502278さん

まずは素数判定のメソッドを書いてみるべきでしょう。話はそれからではないでしょうか。
「Java 素数判定」などで検索をおすすめします。

----

うまく書けないとはどう書いたのでしょうか?超シンプル・超遅バージョンであれば誰でも書けると思います。こんな感じ?

public boolean isSosuu(int number) {
int yakusu = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) yakusu++;
}
return yakusu == 2;
}

  • 違反報告
  • 編集日時:2009/11/8 13:55:28
  • 回答日時:2009/11/7 20:52:21
知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

ただいまの回答者

13時20分現在

2875
人が回答!!

1時間以内に5,107件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する