463回結果 10 13 16 25 30 42 (28)
>>58の設定ファイルで
From 27371 # 表示を開始する行番号
Repeat 27371 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
10 16 25 28 30 42
D:\work>
2等だ!
#define COMMENT '#' /* 【ファイル名】idline.c */
#define YEAR "20" /* 【コンパイル】bcc32 idline.c */
#define SIZE 256 /* 【実行】idline < input.txt > output.txt */
#include <stdlib.h> /* 【用途】日付とIDの行の先頭に#を付加できる */
#include <stdio.h>
#include <string.h>
int main(void) {
char c[SIZE], cYear[ ] = "20 / / ( ) : : ID:";
char *p;
for(;;) {
p = fgets(c, SIZE, stdin);
if(p == NULL) {
break;
}
p = strstr(p, YEAR);
while(p != NULL) {
if(c[0] != ' ' && p[4] == cYear[4] && p[7] == cYear[7] && p[10] == cYear[10]
&& p[13] == cYear[13] && p[17] == cYear[17] && p[20] == cYear[20] && p[24] == cYear[24]
&& p[25] == cYear[25] && p[26] == cYear[26]) {
fputc(COMMENT, stdout); /* 日付とIDの行の先頭に#を付加した */
break;
}
p++;
p++;
p = strstr(p, YEAR);
}
fputs(c, stdout); /* 入力した行をそのまま出力した */
}
return EXIT_SUCCESS;
}
180 :
179:2009/10/02(金) 03:54:50 ID:LbUawBan
>>179 cYear[ ] = "20 / / ( ) : : ID:"; を訂正して、
cYear[ ] = "20 / / ( ) : : ID:";にします。
cYear[ ] = "2009/10/02(金) 03:50:32 ID:";
181 :
179:2009/10/02(金) 03:58:27 ID:LbUawBan
#define COMMENT '#' /* 【ファイル名】idline.c */
#define YEAR "20" /* 【コンパイル】bcc32 idline.c */
#define SIZE 256 /* 【実行】idline < input.txt > output.txt */
#include <stdlib.h> /* 【用途】日付とIDの行の先頭に#を付加できる */
#include <stdio.h>
#include <string.h>
int main(void) {
char c[SIZE], cYear[ ] = "2009/10/02(金) 03:50:32 ID:";
char *p;
for(;;) {
p = fgets(c, SIZE, stdin);
if(p == NULL) {
break;
}
p = strstr(p, YEAR);
while(p != NULL) {
if(c[0] != ' ' && p[4] == cYear[4] && p[7] == cYear[7] && p[10] == cYear[10]
&& p[13] == cYear[13] && p[17] == cYear[17] && p[20] == cYear[20] && p[24] == cYear[24]
&& p[25] == cYear[25] && p[26] == cYear[26]) {
fputc(COMMENT, stdout); /* 日付とIDの行の先頭に#を付加した */
break;
}
p++;
p++;
p = strstr(p, YEAR);
}
fputs(c, stdout); /* 入力した行をそのまま出力した */
}
return EXIT_SUCCESS;
}
05 10 11 33 42 43 / 03 09 26 27 33 34 / 07 12 16 32 39 43 / 12 13 15 18 20 30 / 01 24 26 32 39 40 /
03 06 08 10 28 35 / 14 15 22 37 38 43 / 10 17 22 24 29 30 / 03 22 25 33 37 41 / 08 09 19 22 25 29 /
02 08 28 32 33 42 / 01 12 18 21 23 31 / 04 13 24 28 30 39 / 11 13 19 24 36 43 / 11 19 23 27 28 29 /
11 15 28 36 38 39 / 07 09 11 14 17 21 / 06 08 16 31 34 38 / 03 04 11 19 25 31 / 16 22 27 30 31 36 /
04 16 18 26 31 37 / 10 13 22 23 27 39 / 03 10 14 18 27 32 / 09 12 26 28 35 39 / 02 25 27 29 33 40 /
13 16 20 23 33 36 / 01 05 25 27 39 41 / 01 09 10 17 32 43 / 02 14 20 32 35 40 / 03 11 18 21 29 41 /
01 06 08 24 36 37 / 20 30 32 34 42 43 / 03 15 19 20 22 27 / 02 04 07 17 29 42 / 04 12 15 16 33 38 /
06 09 19 20 37 43 / 01 13 17 34 37 40 / 08 09 27 28 38 43 / 15 31 34 36 41 42 / 01 05 18 19 24 33 /
02 08 24 26 29 35 / 15 20 21 35 41 43 / 05 14 19 29 40 42 / 25 29 30 34 37 38 / 02 16 21 23 39 40 /
02 03 05 18 20 37 / 03 17 26 31 35 36 / 13 14 24 32 33 38 / 04 06 09 23 26 30 / 11 17 23 34 39 41 /
01 08 14 16 26 42 / 04 21 24 27 40 41 / 05 07 08 18 22 40 / 02 05 09 14 15 16 / 07 12 31 33 36 37 /
02 06 11 12 13 27 / 02 05 13 30 40 43 / 09 12 24 30 34 40 / 09 21 31 32 34 35 / 11 17 18 25 30 32 /
15 21 30 33 37 40 / 05 15 20 26 28 29 / 04 10 19 23 40 43 / 09 10 11 15 27 35 / 01 15 23 38 40 41 /
05 09 28 31 36 40 / 01 04 07 13 16 25 / 02 05 12 29 31 39 / 02 07 10 20 26 41 / 12 22 23 35 38 42 /
02 09 22 36 42 43 / 04 05 15 17 21 39 / 01 04 05 10 30 35 / 06 10 14 20 29 34 / 01 02 03 19 30 36 /
10 12 13 17 21 26 / 08 11 13 17 31 33 / 05 13 16 17 32 35 / 02 07 33 34 38 39 / 13 20 27 31 35 42 /
04 05 06 11 20 38 / 16 19 20 25 32 41 / 10 11 21 34 36 37 / 08 15 16 22 24 28 / 03 04 13 15 29 43 /
06 13 18 25 39 42 / 01 06 11 15 17 26 / 08 10 14 25 38 40 / 03 07 11 12 24 38 / 10 22 32 37 40 42 /
07 09 16 29 38 41 / 05 06 21 27 36 43 / 05 08 35 37 38 41 / 05 11 12 14 18 36 / 10 15 19 26 31 39 /
05 07 16 27 37 42 / 01 12 17 20 24 35 / 02 15 17 23 25 37 / 02 09 13 18 19 23 / 07 13 14 27 30 41 /
06 07 17 22 28 33 / 01 02 08 10 12 15 / 01 04 20 32 33 37 / 03 06 13 30 32 37 / 04 19 22 34 35 37 /
03 12 21 22 36 40 / 07 13 15 19 28 42 / 08 29 30 32 39 41 / 04 09 14 36 39 41 / 02 07 19 27 31 43 /
06 23 29 32 33 43 / 10 13 16 28 37 43 / 09 17 20 23 28 42 / 06 07 12 21 25 41 / 14 17 18 20 33 41 /
09 10 23 24 25 33 / 07 28 32 35 36 41 / 06 10 18 31 33 40 / 03 05 23 25 32 38 / 05 16 21 22 26 38 /
03 12 14 19 28 43 / 04 18 32 35 38 43 / 18 21 22 27 28 37 / 03 16 29 36 39 42 / 07 22 24 27 32 34 /
14 25 26 29 36 43 / 10 16 17 19 36 38 / 01 11 22 29 31 32 / 07 18 20 23 24 39 / 11 22 26 28 30 40 /
03 07 08 09 15 31 / 07 14 18 25 28 34 / 04 12 20 22 25 43 / 01 16 29 33 34 35 / 01 04 06 14 19 27 /
01 08 09 20 21 39 / 03 04 08 23 34 36 / 06 13 22 26 36 41 / 11 19 26 35 41 42 / 16 18 23 25 27 35 /
07 10 19 21 29 35 / 06 11 14 23 31 37 / 02 06 21 26 37 42 / 05 23 24 26 34 42 / 03 09 12 13 41 42 /
01 03 23 27 42 43 / 26 30 31 33 38 43 / 08 14 21 23 30 43 / 01 04 09 11 18 42 / 03 14 15 34 35 39 /
06 24 25 26 27 31 / 04 10 26 27 28 36 / 08 12 19 24 31 42 / 02 24 25 28 38 41 / 12 15 19 29 32 34 /
02 11 20 21 24 31 / 01 06 16 21 28 30 / 03 15 21 24 32 42 / 01 15 25 28 31 35 / 08 17 18 21 34 42 /
03 23 29 30 31 40 / 06 10 21 32 38 39 / 01 05 12 13 22 28 / 03 08 17 40 41 43 / 12 17 19 27 30 39 /
09 17 24 31 37 41 / 02 09 11 30 33 41 / 18 19 36 37 39 40 / 17 21 25 33 35 38 / 12 25 28 30 36 42 /
03 09 16 25 30 43 / 01 17 18 28 29 36 / 03 05 09 11 22 39 / 05 07 24 25 35 43 / 04 05 07 14 26 33 /
14 16 17 22 25 39 / 01 18 20 25 26 38 / 02 03 22 28 29 34 / 13 14 19 21 25 37 / 03 06 14 16 24 41 /
04 07 11 15 37 41 / 20 28 31 34 37 39 / 02 18 24 27 30 42 / 06 09 15 24 29 39 / 11 12 31 35 40 43 /
13 21 28 33 34 41 / 04 08 11 21 26 32 / 04 09 15 25 32 40 / 07 08 11 23 25 42 / 20 24 27 29 36 38 /
02 04 05 24 32 36 / 03 05 07 17 30 34 / 11 13 18 22 34 38 / 08 11 20 29 37 40 / 04 16 17 27 34 43 /
14 21 27 31 33 39 / 05 08 09 10 13 34 / 06 07 23 34 35 40 / 01 07 21 26 34 43 / 08 15 17 20 32 38 /
08 12 20 23 27 41 / 10 14 22 31 35 41 / 02 17 21 22 32 41 / 02 04 22 31 38 40 / 01 02 11 16 38 43 /
06 17 27 38 41 42 / 03 07 16 19 33 40 / 06 09 14 33 35 42 / 01 13 21 36 38 42 / 02 04 06 15 18 34 /
08 09 12 14 32 37 / 05 10 15 22 25 36 / 09 13 29 35 36 37 / 02 08 14 19 34 41 / 03 18 28 31 38 42 /
02 03 04 09 10 21 / 07 08 13 26 37 39 / 09 10 12 16 20 31 / 16 19 23 24 30 37 / 08 15 18 25 33 43 /
05 14 20 25 30 31 / 04 06 12 28 37 40 / 02 13 14 26 28 31 / 12 18 22 26 29 33 / 06 07 18 19 30 38 /
14 15 17 27 36 40 / 09 15 18 21 26 36 / 01 02 06 20 22 23 / 05 06 08 15 30 42 / 04 13 23 31 32 41 /
04 14 21 28 29 38 / 03 10 11 16 23 26 / 08 22 33 35 36 39 / 02 10 14 24 39 43 / 10 16 18 30 34 39 /
10 15 23 28 30 32 / 11 18 26 27 39 43 / 03 08 13 16 21 27 / 11 24 28 33 35 37 / 06 11 16 25 36 40 /
01 07 22 30 39 42 / 01 03 10 13 24 31 / 03 13 20 38 39 40 / 01 08 11 27 30 34 / 09 14 20 22 24 26 /
07 17 19 23 26 32 / 19 20 21 23 34 38 / 02 06 17 19 24 40 / 10 19 25 27 34 42 / 10 12 34 38 41 43 /
07 15 16 26 30 35 / 05 18 23 28 41 43 / 04 07 20 30 36 40 / 05 12 17 23 33 40 / 01 12 26 30 37 41 /
16 18 24 29 40 43 / 01 07 10 14 23 36 / 08 10 19 20 30 33 / 02 12 16 25 26 34 / 01 02 07 09 28 37 /
>>182-183は、ランダムで1000万とおり出力したものから260とおりを抽出した。
たぶん最大ではないようなきがする。
/* 【ファイル名】mtform.c
【コンパイル】bcc32 mtform.c
【実行】mtform < input.txt > output.txt
【用途】mtNtoR(
>>57-71)の出力と同様に、行の先頭に半角空白を付加する。6個ある行のみ出力する。
【注意】sscanf()では日本語を処理できないとおもわれる(行頭に#がある場合、sscanf()を使用しない) */
#define COMMENT '#'
#define LOTO 6
#define SIZE 256
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int i1, i2, i3, i4, i5, i6, i;
char *p;
char c[SIZE];
for(;;) {
p = fgets(c, SIZE, stdin);
if(p == NULL)
break;
if(c[0] == COMMENT) { /* 行頭に#がある */
fputs(c, stdout); /* 入力した行をそのまま出力した */
continue;
}
i = sscanf(c, "%d %d %d %d %d %d ", &i1, &i2, &i3, &i4, &i5, &i6);
if(i == LOTO) /* 1行に6個の数を捕捉した */
fprintf(stdout, " %02d %02d %02d %02d %02d %02d\n", i1, i2, i3, i4, i5, i6);
/* 行の先頭に半角空白を付加した */
}
return EXIT_SUCCESS;
}
コンパイルするには、全角空白をタブ(\t)か複数の半角空白に置換します
以下のプログラム(subset)では、3個以上一致する行を排除したテキストを出力する。
ロト6の組合せからなるテキストファイルを入力する。第1行もロト6の組合せでなければならない。
出力は入力ファイルの部分集合である。出力には、入力ファイルの第1行がふくまれている。
main()
1.コマンドと一緒に指定されたテキストファイルをオープンする。
2.高速化のため、中間ファイルとしてバイナリファイル(subset.bin)を生成する。
3.バイナリファイルから6バイトを読み取って、双方向リスト(sLine)の起点としてロト6の組合せを保持する。
4.バイナリファイルを読みながら3個以上一致する組合せを排除するために、
現在、双方向リストとして保持しているすべての組合せにわたって、一致する個数を調査する。
5.3個以上一致する場合、何もしない。
6.さもなければ、双方向リストを伸長して組合せを追加する。
7.双方向リストの内容で、バイナリファイルを上書きする(subset.binは縮小する)
8.バイナリファイルから標準出力(stdout)にテキストを出力する。
BinFile()
1.テキストファイルから1行読み取って配列に記憶する。6個の二桁は、1, 4, 7, 10, 13, 16の位置にある。
2.二桁を整数に変換する。
3.整数として1バイトをバイナリファイルに出力する。
iCount()
1、現在、保持しているすべての組合せにわたって、双方向リストを逆方向にたどりながら一致する個数を調査する。
2.双方向リストの各ノードに対して、文字列の検索を反復するループではなく一度の計算でカウントする。
3.一致した個数の最大値を返す。
2.8 GHzのPentium 4 プロセッサは、BinFile()およびiCount()で、時間がかかる場合がある(1000万行なら30秒程度)
しかし、文字列の検索を反復するループ(注2)ではなく一度の計算でカウントできるため、大幅に高速だ。
400MHzのCeleron プロセッサでも実行できた。MS-DOS 6.2(注1), Windows 98, FreeBSD 4.5で確認した。
(注1)BorlandのTurbo C++ 4.0でコンパイルした。
(注2)100万行で4〜5分かかったきがする。
/* 【ファイル名】subset.h
【コンパイル】bcc32 -esubset subset.c pSetting.c BinFile.c pFirst.c iCount.c pAdd.c Update.c bin2txt.c
gcc -o subset subset.c pSetting.c BinFile.c pFirst.c iCount.c pAdd.c Update.c bin2txt.c
【実行】subset filename
subset input.txt > output.txt
【重要】mtntor.exe(
>>57-71)の出力と同様に行頭に半角空白が付加されたデータを入力する
01234567890123456789
06 24 27 30 32 38
*/
#define OVERLAP 3
#define BIN_FILE "subset.bin"
#define TOTAL 44 /* 43 + 1 */
#define LOTO 6
#define COUNT 1
#include <stdlib.h>
#include <stdio.h>
typedef struct sLine sLine;
struct sLine {
sLine *pPrev;
sLine *pNext;
char cBall[TOTAL];
};
FILE *pSetting(int, char *);
void BinFile(FILE *);
sLine *pFirst(FILE *);
int iCount(char *, sLine *);
sLine *pAdd(char *, sLine *);
void Update(sLine *);
void bin2txt(void);
#include "subset.h" /* 【ファイル名】subset.c */
int main(int argc, char *argv[]) {
FILE *pFile;
FILE *pBin;
sLine *pO;
sLine *p;
int i;
unsigned int u;
char c[LOTO];
pFile = pSetting(argc, argv[1]);/* テキストファイルをオープンした */
BinFile(pFile);/* 中間ファイルとしてバイナリファイルを生成した */
fclose(pFile);
pBin = fopen(BIN_FILE, "rb");
pO = pFirst(pBin); /* 起点として組合せを保持した */
for(p = pO; ; ) { /* バイナリファイルを読みながら3個以上一致する組合せを排除する */
u = fread(c, sizeof(char), LOTO, pBin);
if(u < LOTO)
break;
/* 現在、保持しているすべての組合せにわたって、一致する個数を調査する */
i = iCount(c, p);
if(i >= OVERLAP) /* #define OVERLAP 3 */
continue;/* 3個以上一致する組合せを排除した */
p = pAdd(c, p);/* 組合せを追加した */
}
fclose(pBin);
Update(pO);/* バイナリファイルを縮小した */
bin2txt();/* 標準出力にテキストを出力した */
return EXIT_SUCCESS;
}
/* 【ファイル名】pSetting.h */
#define GUIDE "subset filename\nsubset input.txt > output.txt\n 04 14 29 34 35 43 o\n04 14 29 34 35 43 x\n"
#define BIN_FILE "subset.bin"
#include <stdlib.h>
#include <stdio.h>
/* 【ファイル名】pSetting.c */
#include "pSetting.h"
FILE *pSetting(int i, char *p) {
FILE *pFile;
switch(i) {/* コマンドラインの要素の個数 */
case 2:/* コマンドおよびファイル名 */
break;
default:
fprintf(stderr, GUIDE);
exit(EXIT_FAILURE);
}
pFile = fopen(p, "rt"); /* テキストファイルをオープンした */
if(pFile == NULL) {
perror(p);
exit(EXIT_FAILURE);
}
return pFile;
}
/* 【ファイル名】BinFile.h */
#define BIN_FILE "subset.bin"
#define SIZE 20
#include <stdlib.h>
#include <stdio.h>
/*
【重要】mtntor.exe(
>>57-71)の出力と同様に行頭に半角空白が付加されたデータを入力する
01234567890123456789
06 24 27 30 32 38
*/
enum {
BALL1 = 1, /* c[BALL1], c[BALL2], c[BALL3]とは、c[1], c[4], c[7]のことである */
BALL2 = 4,
BALL3 = 7,
BALL4 = 10,
BALL5 = 13,
BALL6 = 16 /* c[BALL6]はc[16]であり、6個目のボールはc[16]およびc[17]の二桁が表示されている */
};
/* 【ファイル名】BinFile.c */
#include "BinFile.h"
void BinFile(FILE *pFile) {
FILE *pBin;
int i;
char *pStop;
char *p;
char c[SIZE];
pBin = fopen(BIN_FILE, "wb");
if(pBin == NULL) {
perror(BIN_FILE);
exit(EXIT_FAILURE);
}
for(;;) {
p = fgets(c, SIZE, pFile);
if(p == NULL) break;
i = (int)strtol(&c[BALL1], &pStop, 10); /* c[BALL1]およびc[ BALL1 + 1 ]の二桁を整数に変換した */
fputc(i, pBin); /* 整数としてiをバイナリファイルに出力した */
i = (int)strtol(&c[BALL2], &pStop, 10);
fputc(i, pBin);
i = (int)strtol(&c[BALL3], &pStop, 10);
fputc(i, pBin);
i = (int)strtol(&c[BALL4], &pStop, 10);
fputc(i, pBin);
i = (int)strtol(&c[BALL5], &pStop, 10);
fputc(i, pBin);
i = (int)strtol(&c[BALL6], &pStop, 10);
fputc(i, pBin);
}
fclose(pBin);
}
/* 【ファイル名】pFirst.h */
#define GUIDE "subset filename\nsubset input.txt > output.txt\n 04 14 29 34 35 43 o\n04 14 29 34 35 43 x\n"
#define TOTAL 44 /* 43 + 1 */
#define LOTO 6
#define COUNT 1
#include <stdlib.h>
#include <stdio.h>
typedef struct sLine sLine;
struct sLine {
sLine *pPrev;
sLine *pNext;
char cBall[TOTAL];
};
/* 【ファイル名】pFirst.c */
#include "pFirst.h"
sLine *pFirst(FILE *pBin) {
char c[LOTO];
unsigned int u;
sLine *pO;
/* cBall[1]〜cBall[43]は、calloc()により0に初期化される */
pO = calloc(1, sizeof(sLine));
if(pO == NULL) {
perror("pO = calloc()");
exit(EXIT_FAILURE);
}
u = fread(c, sizeof(char), LOTO, pBin);
if(u < LOTO) {
fprintf(stderr, GUIDE);
exit(EXIT_FAILURE);
}
pO->pPrev = NULL;
pO->pNext = NULL;
pO->cBall[ c[0] ] = COUNT;/* cBall[1]〜cBall[43]のうち、存在するボール1個をカウント */
pO->cBall[ c[1] ] = COUNT;
pO->cBall[ c[2] ] = COUNT;
pO->cBall[ c[3] ] = COUNT;
pO->cBall[ c[4] ] = COUNT;
pO->cBall[ c[5] ] = COUNT;
/* 起点であるpOのメモリもUpdate()により解放される */
return pO;
}
/* 【ファイル名】iCount.h */
#define TOTAL 44 /* 43 + 1(cBall[0]は使用しない) */
#include <stdlib.h>
typedef struct sLine sLine;
struct sLine {
sLine *pPrev;
sLine *pNext;
char cBall[TOTAL];/* ボールは1〜43であり、cBall[0]は使用しない */
};
/* 【ファイル名】iCount.c */
#include "iCount.h"
/* 文字列の検索を反復するループではなく計算でカウントできる
たとえば、i = 0 + COUNT + 0 + … + 0 + COUNT + 0 + COUNT + 0 */
int iCount(char *c, sLine *p) {
int i, iMax;
for(iMax = 0 ; p != NULL; p = p->pPrev) { /* 現在、保持しているすべての組合せにわたって、一致する個数を調査する */
i = p->cBall[ c[0] ] + p->cBall[ c[1] ] + p->cBall[ c[2] ] + p->cBall[ c[3] ] + p->cBall[ c[4] ] + p->cBall[ c[5] ];
/* たとえば、i = 0 + COUNT + 0 + … + 0 + COUNT + 0 + COUNT + 0 */
if(i > iMax) {
iMax = i; /* 一致した個数の最大値 */
}
}
return iMax;
}
/* 【ファイル名】pAdd.h */
#define TOTAL 44 /* 43 + 1 */
#define COUNT 1
#include <stdlib.h>
typedef struct sLine sLine;
struct sLine {
sLine *pPrev;
sLine *pNext;
char cBall[TOTAL];
};
/* 【ファイル名】pAdd.c */
#include "pAdd.h"
sLine *pAdd(char *c, sLine *p) {
sLine *pNew;
/* cBall[1]〜cBall[43]は、calloc()により0に初期化される */
pNew = calloc(1, sizeof(sLine));
if(pNew == NULL) {
perror("calloc()");
exit(EXIT_FAILURE);
}
pNew->pPrev = p;
pNew->pNext = NULL;
pNew->cBall[ c[0] ] = COUNT;/* cBall[1]〜cBall[43]のうち、存在するボール1個をカウント */
pNew->cBall[ c[1] ] = COUNT;
pNew->cBall[ c[2] ] = COUNT;
pNew->cBall[ c[3] ] = COUNT;
pNew->cBall[ c[4] ] = COUNT;
pNew->cBall[ c[5] ] = COUNT;
p->pNext = pNew;
p = pNew;
return p;
}
/* 【ファイル名】Update.h */
#define BIN_FILE "subset.bin"
#define TOTAL 44 /* 43 + 1 */
#define COUNT 1
#include <stdlib.h>
#include <stdio.h>
typedef struct sLine sLine;
struct sLine {
sLine *pPrev;
sLine *pNext;
char cBall[TOTAL];
};
/* 【ファイル名】Update.c /
#include "Update.h"
void Update(sLine *pO) {
int i;
sLine *pNew;
sLine *p;
FILE *pBin;
pBin = fopen(BIN_FILE, "wb");
for(p = pO; ; p = pNew) {
pNew = p->pNext;
for(i = 1; i < TOTAL; i++) {/* ボールは1〜43 */
if(p->cBall[i] == COUNT) {/* 存在するボールの番号i */
fputc(i, pBin); /* 整数としてiをバイナリファイルに出力した */
}
}
free(p);
if(pNew == NULL) {
break;
}
}
fclose(pBin);
}
/* 【ファイル名】bin2txt.h */
#define BIN_FILE "subset.bin"
#define SIZE 20
#define LOTO 6
#include <stdlib.h>
#include <stdio.h>
/* 【ファイル名】bin2txt.c */
#include "bin2txt.h"
void bin2txt(void) {
unsigned int u;
char c[LOTO], cLine[SIZE];
FILE *pBin;
pBin = fopen(BIN_FILE, "rb");
for(;;) {
u = fread(c, sizeof(char), LOTO, pBin);
if(u < LOTO) {
break;
}
fprintf(stdout, " %02d %02d %02d %02d %02d %02d\n", c[0], c[1], c[2], c[3], c[4], c[5]);
}
fclose(pBin);
}
たとえば、1000万行のテキストファイルを入力したら、260行になった
>>182-183 この260行のファイルを入力しても260行になる。
>>201 /* 【ファイル名】Update.c / を
/* 【ファイル名】Update.c */ に訂正します
>>197 /* たとえば、i = 0 + COUNT + 0 + … + 0 + COUNT + 0 + COUNT + 0 */
/* たとえば、i = 0 + COUNT + COUNT + 0 + COUNT + 0 */
208 :
名無しさん@夢いっぱい:2009/10/07(水) 02:50:05 ID:7dvkJOtM
C言語で確率ってほんとに上がるの?
>>185 ありがとうございます。
iCount() の一致する個数をカウントする部分が良く分らないのですが、
ポインタと構造体が分かっていなければこれ以上の説明は無理でしょうか?
#define COUNT 1 /* 【ファイル名】mymain.c */
#include <stdio.h> /* 【コンパイル】bcc32 -emymain mymain.c iCount.c */
#include "iCount.h" /* 【実行】mymain */
sLine s; /* グローバル変数としてsを確保した。cBall[1]〜cBall[43]は、グローバル変数であり0に初期化された */
int iCount(char *, sLine *);
int main(void) {
int i;
char c[6] = {1, 4, 19, 28, 34, 40};/* 記憶対象(記憶内容を表示する) */
char cS[6] = {2, 4, 19, 27, 34, 41};/* 調査対象(記憶対象と一致した個数を表示する) */
sLine *p = &s; /* ポインタpはsをさす */
p->cBall[ c[0] ] = COUNT; /* #define COUNT 1 */
p->cBall[ c[1] ] = COUNT; /* cBall[1]〜cBall[43]のうち、存在するボール1個をカウント */
p->cBall[ c[2] ] = COUNT;
p->cBall[ c[3] ] = COUNT;
p->cBall[ c[4] ] = COUNT;
p->cBall[ c[5] ] = COUNT;
p->pPrev = NULL; /* このプログラムは実験用であり、ノードは1個のみであり、双方向リストを形成しない */
p->pNext = NULL;
for(i = 1; i < 43; i++)
printf("%d", p->cBall[i]);/* cBall[1]〜cBall[43]の記憶内容を表示した */
i = iCount(cS, p);/* i = 0 + COUNT + COUNT + 0 + COUNT + 0(cBall[2], cBall[3], cBall[5]の3個が1) */
printf("\n\niCount = %d\n", i);/* 記憶対象と一致した個数を表示した */
return EXIT_SUCCESS;
}
D:\work\subset>mymain
100100000000000000100000000100000100000100
iCount = 3
D:\work\subset>
212 :
210:2009/10/11(日) 16:27:39 ID:qQt2n5Gg
>>210 i < 43を
i <= 43に訂正します
>>209 D:\work\subset>mymain
1001000000000000001000000001000001000001000
.↑ ↑第六のボールの41は0だから一致していないことがわかる
第一のボールの2は0だから一致していないことがわかる
>>210-213 詳しい解説を本当にありがとうございます。
比較処理部分の高速化に興味がありました。
石豆さんのmallocは自分が使っている低級言語にはないから流用できないし。
正直に言うとレベルが違いすぎて他にもまだ分らない部分が
ありますが時間をかけて勉強するつもりです。
215 :
名無しさん@夢いっぱい:2009/12/08(火) 23:54:55 ID:hg/GMEDN
有料の競馬予想とかでも思うけど、そんなに儲かるのなら
自分だけでやっとけよって話だよなw
217 :
名無しさん@夢いっぱい:2009/12/15(火) 18:24:15 ID:PIdaTgAB
/スヽ、.. -─…‐| |´ ̄` 、
//.:,`'´ ヽ\::::::.. \
,〈〈::/ / \>.、:::::.. \
,.' .:/ | .:.:.| \::\::::::.. \
/ .::/ ', .:.:.:ト _.二ニ ヽ‐\::::::.. \
/ .:::/ /\::::::::|'´ x≧、、:::::::::::Yl|´\::::::.. \
/ .::::: ! :| ィ´ ̄\::| f{、ハ '}ヽ:::::::::[I|J V⌒ヽ,、. \
/ .::::::::::| ,{:.:.:.:.: |ィにヾ ` ヾツ |::\:::Ll \./ \ \
/ .::::::::::/|,' ∨ ::小. ヾり , |:::::∧|‐,x / \ \
/ .::::::::::/ ∨:::|∧ 、-、 .|::/ / ヽr'´ \ ヽ
. / .:::: :/ \|:::::ゝ.,..__ ,.ニ´ / |/_ `二.¬、 ヽ :.',
/ .:: / ',:::::::/ ミ.彡'ニ.´___〉 ヽ´ ` ァ>、 ', :::i
. / .: / ヽN / マ |、 |\ // \ |. ::|
/ : / | ',. 、 トヘ | \ | | ハ |
. / ,′ | , ,コ. ヽ \. \ゝ---┬─┬r'´.:::::. !
/ . ! ! 、/ / \ \\ ヽ / .:::::/ノ .:::::::::リ
. / : .: | ', 〈_/ \ \` <}/.:::/ ..::::::::::::/
/ :::. | \ \ \ ト . ` く ...::::::::::::::,.'
. ′ :::::.. ', \ |\ l. \ \::::::::/|
| . :::::::::...... ヽ、 く_ソ \ \ |:::\ \´.::::!
| :: ::::::::::::::::::::::..`..− .__ `ーr‐' ヽ. \::::::::.', ヽ::/
|:::::: ::::: `ヽ、_ / ̄ >' \ ` 、 l }′
|:::::::... :... ハ  ̄ ̄ \ `丶 ._ノ_
Y:::::::::::::::::::::.......... ::.... __ _. -┴‐∨ \ ヽ `ヽ
ヽ::::::|:::::::::::::::::::::::::::::::::::::::', ,ニ=-──\ / \ }
. \lー----─- 、:::::::::::::∨ ヽ \ _ / \ ヽ、 ヽ
ヽ:::::::::「 } \,∠ -`ヽ/ ヽ.__',\ |
',:::::::| ┌‐'───----- __ノ / / ヽ. ノ
| :::ー| __. -‐ _ノ / |`ー-ァ'´
,' ,厶::: |‐ ' ´ ____,} /_. -r‐.‐} ∨
ノ'´ }:::.7⌒ ー、-‐'´ ∨ _,. -'´ ,′V-─〉
|/ ヽ マ´ /___/
477回 12 14 16 18 38 41 (17)
>>58の設定ファイルで
From 180605 # 表示を開始する行番号
Repeat 180605 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
12 14 16 17 18 41
D:\work>
2等だ!
2009年9月17日(
>>178)以来、3か月ぶりだ。
219 :
名無しさん@夢いっぱい:2010/02/12(金) 00:50:17 ID:2om3AiXo
ポインタでまた挫折。
833 :-:2010/02/11(木) 20:12:42 ID:UNpU/La+
>>753のようなレスを毎回見るので
前スレ794から
>>643までの今回の晒し2748口が
3等以上に当せんする確率
(全6096454通りのうち、この2748口のどれかと5個以上数字が
一致するものを数え上げる)を求めたところ
547554/6096454 = 約8.98%であることが分かった。
この処理は何秒くらいかかるのでしょうか。
手元のソフトだと0.1秒も掛からないから不思議。
220 :
-:2010/02/12(金) 23:54:42 ID:J9EV4bLJ
2分くらいだったと思う。
484回結果 13 19 25 29 32 35 (42)
>>58の設定ファイルで
From 54968 # 表示を開始する行番号
Repeat 54968 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
13 25 29 32 35 42
D:\work>
2等だ!
2009年12月24日(
>>218)以来、約2か月ぶりだ。
>>220 石豆さんが応えてくれたの2年ぶりくらいかな
やっぱり何か処理を大幅に省く方法があるのかもしれません
485回結果 14 26 30 33 34 39 (19)
>>58の設定ファイルで
From 98274 # 表示を開始する行番号
Repeat 98274 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
14 19 30 33 34 39
D:\work>
連続で2等だ!
491回結果 07 09 20 27 31 34 (33)
>>58の設定ファイルで
From 119022 # 表示を開始する行番号
Repeat 119022 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
07 09 20 27 31 33
D:\work>
2等だ!
497回結果 06 12 14 17 36 40 (34)
>>58の設定ファイルで
From 2893 # 表示を開始する行番号
Repeat 2893 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
06 12 17 34 36 40
D:\work>
2等だ!
506回結果 05 11 21 27 37 39 (26)
>>58の設定ファイルで
From 109762 # 表示を開始する行番号
Repeat 109762 # 反復する回数
に変更したら
D:\work>mtntor mtntor.ini
05 11 21 27 37 39
D:\work>
1等だ!!
>>117 >>160 >>163につづいて、1等は四回目だ。