【LOTO6】安価で【5週分】

このエントリーをはてなブックマークに追加
99-
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Q 43
#define R 6096454

long cmb(int a,int b);
long c2n(char *a);
void lt6(char *a);
void set0(char *a,long b);

void main(int argc,char *argv[]){
  if(argc==2){
    char *mem,*tab,*p1;
    int i,j;
    long cnt,jnb;
    FILE *fp;
100-:2008/10/18(土) 16:40:56 ID:McwsEfkG
    mem=malloc(Q*R); srand((unsigned)time(NULL));
    tab=malloc(R); set0(tab,R);
    fp=fopen(argv[1],"w");
    cnt=0; p1=mem;
    while(cnt<250000){
      lt6(p1); jnb=c2n(p1); if(*(tab+jnb)) continue;
      i=j=0;
      while(i<Q && j<6){
        if(*(p1+i)){
          fprintf(fp,"%02d ",i+1); j++; }
        i++; }
      fprintf(fp,"\n"); p1+=Q; printf("%7d\r",++cnt);
      *(tab+jnb)=1; }
    fclose(fp); free(mem); free(tab); printf("\n");
  }
  else puts("l005.c");
}
101-:2008/10/18(土) 16:44:24 ID:McwsEfkG
long cmb(int a,int b){
  double i,j;

  i=j=1.0; b=(b>a/2)?a-b:b;
  while(b>0){
    i*=a; j*=b; a--; b--; }
  return(long)(i/j);
}

long c2n(char *a){
  int i,j,n[6];
  long k;

  i=j=0;
  while(i<Q && j<6){
    if(*(a+i)){
      n[j]=i+1; j++; }
    i++; }
  i=0; k=0;
  while(i<6){
    j=1;
    if(i>0) j+=n[i-1];
    while(j<n[i]){
      k+=cmb(43-j,5-i); j++; }
    i++; }
  return(k);
}
102-:2008/10/18(土) 16:47:54 ID:McwsEfkG
void lt6(char *a){
  int i,j;

  set0(a,Q);
  i=0;
  while(i<6){
    j=rand()%Q;
    if(*(a+j)==0){
      *(a+j)=1; i++; }}
}

void set0(char *a,long b){
  long i;

  i=0;
  while(i<b){
    *(a+i)=0; i++; }
}