トップページ⇒tech
440コメント160KB

気ままにC言語

■ このスレッドは過去ログ倉庫に格納されています
0001ツマルNGNG
ん、僕ツマルって言う名前ですの。
これからこのスレに今までツマルがC言語で作った
プログラムのソースを載せるですの。
完璧なものじゃないけど、ツッコミは勘弁して欲しいですの。
適当に修正してくれるのは構いませんですの。
コンパイラは「Borland C++ Compiler 5.5」を使っていますですの。
http://www.borland.co.jp/cppbuilder/freecompiler/index.html
0390388NGNG
あ、そか。すんません。
でもjの2乗が、じゃなくてもi!=jでいいような気がするけど。
0391デフォルトの名無しさんNGNG
>>390
よくない
0392デフォルトの名無しさんNGNG
>>384
もっと素直に書かないからわけわかんなくなるんだよ。
関数使えばすっきりするじゃん。

#include <stdio.h>

int isprime(int n){
 int d;

 if ( n%2==0 ) return 0;

 for (d=3; d*d<=n; d+=2)
  if ( n%d==0 ) return 0;

 return 1;
}


int main(){
 int i;

 for (i=1;i<=10000;i++)
  if ( isprime(i) )
   printf("%d\t",i);
}
0393384NGNG
if (n==2) return 1;
って入れるの忘れた。鬱だ
0394388NGNG
ごめん。また勘違いした。
もう少しちゃんと考えてから書き込むようにしよう。
0395デフォルトの名無しさんNGNG
これじゃだめ?

int main(void){
int i,j;
for(i=2; i<=10000; i++){
for(j=2; (i % j)!=0; j++);
if( i == j) printf("%d\n",i);
}
return 0;
}
0396デフォルトの名無しさんNGNG
>>395
だめ(笑)
ネタだろ
0397デフォルトの名無しさんNGNG
>>386
>自分自信でしか割り切れないって確かめないといけないのですか?
確かめなくてもいい

>1でしか割り切れなかったら、1と、自分自信って決まってるから
>いいのかなあ、と思った。
1で割り切れることも確かめなくていい

>>384がj*j>iになったら素数と判定してるのも
それ以上は確かめなくていいから
 j==iで判定したら最大で10000回のループ
 j*J>iで判定したら最大で100回のループ

>>385がi+=2にしたらといっているのも
偶数は確かめなくていいから
0398デフォルトの名無しさんNGNG
>>395
i%j!=0とi==jは両立しないので素数は表示されないよ
やるならi==j+1で判定しなくちゃ

それでも、2が素数にならないし>>397がいってるとおり
コストがかかりすぎるのでやっぱだめ
0399398NGNG
>>395
すまん、コストがかかる以外は問題ないよ。
if文が内側ループの外にあるのに気づかなかった。
インデントしてあれば・・・
0400デフォルトの名無しさんNGNG
>>395
うだうだ吠えるなボケ。この関数使えば終わりなんだよカスが

int isprime(int n){
 if ( n==2 ) return 1;
 if ( n%2==0 ) return 0;
 for (int i=3; i*i<=n; i+=2)
  if ( n%i==0 ) return 0;
 return 1;
}
0401デフォルトの名無しさんNGNG
>>400
if(n<2)return 0;
を追加しなさい。
0402デフォルトの名無しさんNGNG
>>400
>うだうだ吠えるなボケ。この
1を素数と判定してしまう
>関数使えば
プログラマーとして
>終わりなんだよカスが
0403デフォルトの名無しさんNGNG
>>400-402
ワラター(´ー`)==3
0404デフォルトの名無しさんNGNG
素数が6の倍数の前後にあるというのは、
何かに使えないでしょうか?

もちろん例外はありますが。35とか。
0405デフォルトの名無しさんNGNG
>>404
35 が例外??
36 の 1 つ前にあるでしょ
0406 NGNG
素数を使って何がしたいのだ?
0407デフォルトの名無しさんNGNG
>>364が、単に素数を求める方法が知りたいだけなら
エラトステネスの篩を勉強することを勧める

つうか、>>364の書いたエラトステネスの篩版の
ソースを見てみたい
0408デフォルトの名無しさんNGNG
ふるい。10000*16 までの整数について調べられる。

#define INTSIZE sizeof(long int)

/* nが素数ならば、ビット目が1である */
long int bits[10000];

/* d の倍数目のビットを全て 0 にする */
for (int d=2; d < 10000*INTSIZE ; d++ ){
{
 if ( ( bits[ d/INTSIZE ] & (1<<(d%INTSIZE)) ) == 0 ) continue; /* d が素数で無いならば、飛ばす */

for (int i=d; i*d < 10000*INTSIZE ; i+=d ){
  bits[ i*d/INTSIZE ] |= 1 << (i*d%INTSIZE);
 }
}
0409デフォルトの名無しさんNGNG
>>404
やってみた。
値は正しく求められるようだ。(100万以下の素数で確認)
チェックする対象を絞り込める分、絞り込まないやり方に比べて、
相当速くなる。
が、エラトステネスの篩を使ったやり方には及ばなかった……。
(当社比 ワラ)

#include <stdio.h>
#include <math.h>
#define MAXNUM 10000

int main(void)
{
 unsigned long n, lim, i;
 char prime[MAXNUM + 1] = { 0, 0, 1, 1 };

 for (i = 6; i < MAXNUM; i += 6) { /* 6の倍数の前後を素数と仮定 */
  prime[i - 1] = 1;
  prime[i + 1] = 1;
 }

 for (n = 5; n <= MAXNUM; n++)
  if (prime[n]) /* 本当に素数かどうかの検証 */
   for (prime[n] = 0, i = 2, lim = (int)sqrt(n); n % i; i++)
    if (i > lim) {
     prime[n] = 1;
     break;
    }

 for (n = 2; n <= MAXNUM; n++)
  if (prime[n])
   printf("%d ", n);
 
 return 0;
}
0410デフォルトの名無しさんNGNG
訂正。整数型の範囲をこえる数値でも
判定可能!

#define INT_SIZE sizeof(long int)
#define COUNT 10000

...

/* nが素数ならば、ビット目が0であるようにする */
long int bits[COUNT];
int p, q, i, base;

/* 全てのビットを0に */
for ( i = 1 ; i < COUNT ; i++ ){
bits[i] = 0;
}

for ( base=2; base < COUNT*INT_SIZE ; base++ ){
{
p = base / INT_SIZE;
q = base % INT_SIZE;

/* 既に非素数のチェックがついているならば飛ばす */
if ( bits[ p ] & (1<<q) ) continue;

/* base より大きい、全てのbaseの倍数目のビットを全て 1(非素数) にする */
for ( i=base*2 ; i*base < COUNT*INTSIZE ; i+=base ){
p = i / INT_SIZE;
q = i % INT_SIZE;
bits[p] |= 1 << q;
}
}

/* 表示 */
for ( i=2; i < COUNT*INT_SIZE ; i++ ){
{
p = base / INT_SIZE;
q = base % INT_SIZE;

if ( bits[ p ] & (1<<q) == 0)
printf("%d is prime\n", i );
}
0411デフォルトの名無しさんNGNG
>>410
やりたい事は分かるけど、これじゃ整数型を超える範囲
あつかえないじゃん。ビット計算をもっと工夫しないと。
0412デフォルトの名無しさんNGNG
>>410
めちゃくちゃメモリの無駄遣い。

charが8ビットのマシンでそのソースを実行したら
bits[]を8分の1しか使ってないことになる。
0413デフォルトの名無しさんNGNG
>charが8ビットのマシンでそのソースを実行したら
>bits[]を8分の1しか使ってないことになる。

なして?
0414デフォルトの名無しさんNGNG
>>413
410のコードは、sozeof(long)が4のとき、bits[]の要素ひとつに付き、
4ビットしか使ってないから。

4ビット/32ビット→ 1/8
0415デフォルトの名無しさんNGNG
sizeof(long int ) ってsizeof(long) と解釈されるの?
0416デフォルトの名無しさんNGNG
>>415
(゚Д゚)ハァ?

long int == long だろ?
0417デフォルトの名無しさんNGNG
>>416
ほほう
0418デフォルトの名無しさんNGNG
じゃあ、 >>410 のプログラムを、ビット単位で素数非素数を表すという
考え方はそのままにして正しくコーディングするとどうなるわけ?
0419デフォルトの名無しさんNGNG
>>418
こんな感じ。(動作確認はしてないんで、バグってたらスマソ)

#define SET_FLAG(bits,n) bits[n/CHAR_BIT] |= 1 << (n%CHAR_BIT)
#define CHECK_FLAG(bits,n) (bits[n/CHAR_BIT] & (1 << (n%CHAR_BIT)))

int i, j;
char bits[10000];

memset(bits, 0, sizeof bits);

for( i = 2; i < sizeof bits * CHAR_BIT; i++ ) {
 if( CHECK_FLAG(bits,i) ) continue;
 for( j = i*2; j < sizeof bits * CHAR_BIT; j+=i ) {
  SET_FLAG(bits,j);
 }
}
SET_FLAG(bits,2);

/* 表示 */
for( i = 2; i < sizeof bits * CHAR_BIT; i++ ) {
 if( CHECK_FLAG(bits,i) ) {
  printf("%d\n", i );
 }
}
0420デフォルトの名無しさんNGNG
>>419
これ非素数の場合にフラグ立ててるから、
表示部の if は条件逆なのでは。
0421デフォルトの名無しさんNGNG
>>419のSET_FLAG と CHECK_FLAG を
ファイルの n ビット目を参照するようにすれば、
2GB のファイルで 8*1024*1024*1024*2 = 2^(3+10+10+10+2) = 2^35
までの整数について調べ、同時に素数を保存する事が出来ますか。
0422_NGNG
一流ハッカーはCでどの程度プログラムが組めれば
一人前なんでしょうか基準を教えて下さい。
0423デフォルトの名無しさんNGNG
一流ハッカーなら gcc 程度のやつを書けるぐらいだな。
0424デフォルトの名無しさんNGNG
>>422
クラッカーなら我慢強いだけでOK。技術はイラン
ハッカーにしても、ここの厨房に驚かれる程度でいいんじゃねーか?
0425デフォルトの名無しさんNGNG
>>424
その程度はハッカーとは夜番。
0426 NGNG
なんでハッカーにプログラミング技術必要なの?

あと、プログラミングって楽しい?
0427デフォルトの名無しさんNGNG
楽しいよ。もうやめられない。
>>426
0428デフォルトの名無しさんNGNG
>>426 プログラミングって楽しい?
そういう疑問が浮かぶ人間には一生なれない何かです。>>ハッカー
この書き込みははっきりいって煽りですがわりと事実です。
0429 NGNG
プログラミングって何が楽しいの?
フリーウェアとかいっぱいあるし、自分ですることもないでしょ?
0430デフォルトの名無しさんNGNG
>>429
音楽やってる人に同じこと聞いてみな。
ほとんどの場合「好きだから」だよ。(仕事以外では(;´Д`))

それとも、君は自殺志願者かい?
0431 NGNG
プログラミングわからんで悩んでるんだ。
pcの学校なんか入らなきゃ良かった。
0432デフォルトの名無しさんNGNG
>>431
なんだ・・・
ネタじゃないのか・・・

PCのゲームやったことある?
または、すごいと思うソフトとかある?

そういうものを自分で作りたいと思えば、楽しくなるよ。

(決して仕事にしたいなんて思うなよ・・・)


ないなら、その学校入らなきゃよかったね。
0433 NGNG
思ったことあるよ。
でも、そんな凄いゲームすぐ作れない。
小さな問題とかをちょっとずつしていかなくちゃいけない。
それが数学とか頭使うのばかりで全然わからない。
ゲーム作るのがとても先で、ついていくだけでもう駄目。
鬱だ・・・・・・・・・
ネットしてないで、勉強しようっと。
END
0434デフォルトの名無しさんNGNG
>>433
はは.....
すぐ作るって.....

君は飛行機作るときに、小さいものから作らないタイプだね.....

対戦型(AIなし、人対人)オセロでも作ってみ
感動するから。(作ったときは)
0435デフォルトの名無しさんNGNG
http://www.teu.ac.jp/chiit/~yyamazaki/labo/othello.html
0436カウンセリングルーム for 駆けだしプログラマーNGNG
初めはなかなか実力が付いてきたという実感が得られない

キャラクタベースの小さなソフトと派手なゲームとの
ギャップが実際以上に大きく見えてしまい、前途のあまりの
長さに愕然とする


テナ感ジカ?
0437デフォルトの名無しさん01/08/26 19:27ID:pP2VgnkE
16bit BMP画像(モノクロデータ)の作成について

Image画像(現在、UNIXのXウィンドウで表示している)をBMP画像(ウィンドウズの環境で表示)に変換するプログラムを作っているのですがうまくいきません。
Image画像はピクセル値2バイトのモノクロデータ(カラーテーブル有り)ですが、BMP画像に変換するとカラー色がついてしまいます。
原因は、カラーテーブルが使われていないようです。
(16bit以上はカラーテーブルが使われないようですが、使うことはできないのですか?)
やっぱり、BITMAPINFOHEADER構造体の指定が間違っているのでしょうか?
0438デフォルトの名無しさん01/08/27 18:56ID:64LMS1no
age
0439デフォルトの名無しさん01/08/28 17:40ID:uEuk16aY
このプログラムで最大、最小値、中央値を求めたいのですが、このプログラムにはなにが不足しているのでしょうか?

#include <stdio.h>

main()
{
int score, i, j, n=0, data[100], work;

do{
printf("%d件目のデータを入力してください。(終了時は-99999)",n+1);

scanf("%d", &score);

if(score!=-99999){
data[n++]=score;
}
}while(score!=-99999);

for(i=0; i<n-1 ;i++){
for(j=i+1; j<n; j++){
if(data[i]<data[j]){
work=data[i];
data[i]=data[j];
data[j]=work;
}
}
}
}
0440デフォルトの名無しさん01/08/28 17:45ID:SKp6r0.c
>>439
宿題はここで訊いた方が回答早いと思うよ。
お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
■ このスレッドは過去ログ倉庫に格納されています