OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

  • 困ってます
  • 質問No.109574
  • 閲覧数249
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 45% (26/57)

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル8

ベストアンサー率 33% (10/30)

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。
お礼コメント
chikako-imagawa

お礼率 45% (26/57)

ありがとうございました!!無事プログラム完成しました!!
ホントCって難しい。。。。。。ですねぇ。
投稿日時 - 2001-07-26 18:46:04
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2

「ビット操作を用いて」というのは、 ・素数かどうかの判定で使う ・b-a=c-bよりc=2*b-aの計算に使う ・自然数i(2~200)が素数かどうかを第iビットが0か1かで表す 等々が考えられます。 第3の意味での利用とすると、 200ビットを連続した領域として確保するわけですが、 ビット演算の練習としては あまり適切な練習問題とは思えません。 もしそうだとすれば、 naga ...続きを読む
「ビット操作を用いて」というのは、
・素数かどうかの判定で使う
・b-a=c-bよりc=2*b-aの計算に使う
・自然数i(2~200)が素数かどうかを第iビットが0か1かで表す
等々が考えられます。

第3の意味での利用とすると、
200ビットを連続した領域として確保するわけですが、
ビット演算の練習としては
あまり適切な練習問題とは思えません。

もしそうだとすれば、
nagataさんのいうように、int型変数をいくつか並べて、
それを一つとみてビット演算できるように関数やマクロを作る
ことになるでしょう。
しかし、アセンブラではないので、その手間を考えると、
ビットで考えるよりは、大きさ200の配列を考えるのが
通常ではないでしょうか。

上記の1番目、2番目での利用ではないのですね?

そこで、ご質問とはずれますが、
やはり第3の意味での利用だとして、
この場合、「ビット演算」というよりは、
配列を使った「論理演算」の練習問題と読み替え、
次のようにするのが普通ではないかと思います。

前半で、エラトステネスのふるいを使って、
自然数p(2~200)が素数かどうかを、
配列inval[p]に0(素数でない)か1(素数である)として設定します。
後半は、配列要素inval[a],inval[b],inval[c]を呼び出して
各a,b,cが素数かどうかの判断をします。

#include<stdio.h>
main()
{
int flag[201];
int inval[204];
int i,p,k,j,a,b,c;

/* using sieve of Eratosthenes */
printf("%4d",2);
inval[2]=1;
j=1;
for(i=0;i<=200;i++){
flag[i]=1; /* true */
inval[i]=0; /* false */
}
for(i=0;i<=100;i++)
if(flag[i]){
p=2*i+3;
printf("%4d",p); inval[p]=1; /* true */
for(k=i+p;k<=100;k+=p) flag[k]=0; /* false */
j++;
}
printf("\nthe number of primes %d\n",j);

/* using logical operation */
for(a=2;a<200;a++)
for(b=a+1;b<199;b++){
c=b+b-a;
if(inval[a]&&inval[b]&&inval[c]&&(c<=200))
printf("%d-%d-%d ",a,b,c);
}
}

(あるいは、このプログラムの応用として、
自然数iが素数かどうかを、配列の第i要素の
第1ビット目が0か1かで表すという方法もあります。)

以上、勝手な読み替えをして申し訳ありません。
ご参考まで申し上げたくて投稿いたしました。
お礼コメント
chikako-imagawa

お礼率 45% (26/57)

ありがとうございます!!一応ヒントとして先生が普通に作ったプログラム(配列を使って素数でない項に1をいれていく)というプログラムがあって、それをbit演算を使ってやるって問題だったんです。とりあえず、プログラムは完成しました!!!
投稿日時 - 2001-07-26 18:51:42


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ