
2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ
解決済
- 気になる
- 0
- 件
- 質問日時:
- 回答数:2件
ちょっと考えてみました。でも、分かりません・・・まず、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);
}/*三つ子の素数を調べ出力
No.1ベストアンサー
- 回答日時:
まず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);
}
という感じです。
No.2
- 回答日時:
「ビット操作を用いて」というのは、
・素数かどうかの判定で使う
・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かで表すという方法もあります。)
以上、勝手な読み替えをして申し訳ありません。
ご参考まで申し上げたくて投稿いたしました。
ありがとうございます!!一応ヒントとして先生が普通に作ったプログラム(配列を使って素数でない項に1をいれていく)というプログラムがあって、それをbit演算を使ってやるって問題だったんです。とりあえず、プログラムは完成しました!!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で構造体の配列を持った構造...
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の2次元配列 容量が大き...
-
コンボボックスでデフォルト値...
-
関数から配列を返すには?
-
c言語 構造体
-
VBAのプログラムで、DIAG = 1# ...
-
プログラムによく出てくるst...
-
C言語 配列の長さの上限
-
C# DataTableの行をソートしてD...
-
C++で、メンバもヒープに確保さ...
-
c言語のポインタへの文字列入力...
-
銀行ATMの数字キーの配列
-
newしないオブジェクトについて
-
Integer変数をカラにしたいので...
-
C言語のプログラムについてです
-
HOSTENT構造体を宣言する必要は...
-
std::stringクラスのc_str()で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
int i, int i[1];
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
C#でのフィボナッチ数列
-
c言語 構造体
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
fclose()でセグメンテーション違反
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
const で宣言してるのに、値が...
-
配列の不正アクセスについて
おすすめ情報