#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define NUM 256
#define FILE_NAME "prime.bin"
#define DBG 0
int main(int argc,char *argv[]){
unsigned long n;/* 素数かどうかを判断される数 */
unsigned long prime[NUM]={0};/* 素数を入れる配列 */
#if !DBG
unsigned char tmp[4];
#endif
int w=0;
FILE *fp;
/* 過去に素数をどこまで計算したかを読み取る */
printf("準備中...");
if((fp=fopen(FILE_NAME,"rb"))==NULL){
/* 計算したことがなければ新規作成 */
if((fp=fopen(FILE_NAME,"wb"))==NULL){
printf("Error in %d, %s.\n",__LINE__,__FILE__);
system("pause");
return(1);
}
prime[0]=2;/* 2は素数 */
prime[1]=3;/* 3も素数 */
fwrite(prime,sizeof(prime[0]),2,fp);
fclose(fp);
n=5;/* 5からチェック開始 */
}else{
int m;/* 配列をいくつ読み取れたかを数える */
unsigned p;/* 過去に読み取った配列の最後の数値を記憶 */
while((m=fread(prime,sizeof(prime[0]),NUM,fp))==NUM)
p=prime[NUM-1];
if(m==0)
n=p+2;
else
n=prime[m-1]+2;
fclose(fp);
}
printf("\r計算中...");
#if !DBG
putchar('\n');
#endif
/* 素数を求める */
for(;n<20;n+=2){
unsigned short flag=1;
int m;
if((fp=fopen(FILE_NAME,"rb"))==NULL){
printf("Error in %d, %s.\n",__LINE__,__FILE__);
system("pause");
return(1);
}
while((m=fread(prime,sizeof(prime[0]),NUM,fp))>0){
int i;
for(i=0;i<m;i++){
if(prime[i]*prime[i]>n)
goto LAVEL_1;
if(n%prime[i]==0){
flag=0;
goto LAVEL_1;
}
}
}
LAVEL_1:
fclose(fp);
if(flag){
if((fp=fopen(FILE_NAME,"ab"))==NULL){
printf("Error in %d, %s.\n",__LINE__,__FILE__);
system("pause");
return(1);
}
#if DBG
fwrite(&n,sizeof(n),1,fp);
#else
printf("%02X ",tmp[0]=(unsigned char)n);
printf("%02X ",tmp[1]=(unsigned char)(n>>8));
printf("%02X ",tmp[2]=(unsigned char)(n>>16));
printf("%02X\n",tmp[3]=(unsigned char)(n>>24));
// fwrite(tmp,sizeof(tmp[0]),4,fp);
fwrite(&tmp[0],sizeof(tmp[0]),1,fp);
fwrite(&tmp[1],sizeof(tmp[1]),1,fp);
fwrite(&tmp[2],sizeof(tmp[2]),1,fp);
fwrite(&tmp[3],sizeof(tmp[3]),1,fp);
#endif
fclose(fp);
}
}
printf("\r\a\a\a計算終了\n");
system("pause");
while(argv[0][w])
w++;
while(argv[0][w]!='\\')
w--;
argv[0][w+1]='l';
argv[0][w+2]='o';
argv[0][w+3]='o';
argv[0][w+4]='k';
argv[0][w+5]='.';
argv[0][w+6]='e';
argv[0][w+7]='x';
argv[0][w+8]='e';
argv[0][w+9]='\0';
system(argv[0]);
system("pause");
return(0);
}
====look.c===
#include<stdio.h>
#include<stdlib.h>
void print_bit(unsigned char ch){
int n=2;
while(n--)
switch((ch>>(4*n))&15U){
case 0:printf("0000 ");break;
case 1:printf("0001 ");break;
case 2:printf("0010 ");break;
case 3:printf("0011 ");break;
case 4:printf("0100 ");break;
case 5:printf("0101 ");break;
case 6:printf("0110 ");break;
case 7:printf("0111 ");break;
case 8:printf("1000 ");break;
case 9:printf("1001 ");break;
case 10:printf("1010 ");break;
case 11:printf("1011 ");break;
case 12:printf("1100 ");break;
case 13:printf("1101 ");break;
case 14:printf("1110 ");break;
case 15:printf("1111 ");break;
}
}
int main(void){
FILE *fp;
unsigned char tmp[4];
int j=1;
int n;
fp=fopen("prime.bin","r");
while((n=fread(tmp,sizeof(tmp[0]),4,fp))>0){
int i;
printf("%10d: ",j++);
for(i=0;i<n;i++)
printf("%02X ",(unsigned)tmp[i]);
for(i=n;i<4;i++)
printf(" ");
putchar(' ');
for(i=0;i<n;i++)
print_bit((unsigned)tmp[i]);
for(i=n;i<4;i++)
printf(" ");
printf(" %10d\n",0+(n>=1)*((unsigned)tmp[0])+(n>=2)*(((unsigned)tmp[1])<<8)+(n>=3)*(((unsigned)tmp[2])<<16)+(n>=4)*(((unsigned)tmp[3])<<24));
if(j%256==0)
system("pause");
}
return(0);
}
===========実行結果================
計算中...
05 00 00 00
07 00 00 00
0B 00 00 00
0D 00 00 00
11 00 00 00
13 00 00 00
計算終了
続行するには何かキーを押してください . . .
1: 02 00 00 00 0000 0010 0000 0000 0000 0000 0000 0000 2
2: 03 00 00 00 0000 0011 0000 0000 0000 0000 0000 0000 3
3: 05 00 00 00 0000 0101 0000 0000 0000 0000 0000 0000 5
4: 07 00 00 00 0000 0111 0000 0000 0000 0000 0000 0000 7
5: 0B 00 00 00 0000 1011 0000 0000 0000 0000 0000 0000 11
6: 00 00 00 11 0000 0000 0000 0000 0000 0000 0001 0001 285212672
7: 00 00 00 13 0000 0000 0000 0000 0000 0000 0001 0011 318767104
8: 00 00 00 0000 0000 0000 0000 0000 0000 0
続行するには何かキーを押してください . . .
何が悪いんでしょう?