lotto003.cpp

#include <stdio.h>      /* printf, scanf, puts, NULL */

#include <stdlib.h>     /* srand, rand */

#include <time.h>       /* time */

#include <algorithm>    // std::sort, std::find, std::copy

#include <vector>       // std::vector


void getRandomLottoWin(int *r) // 당첨번호+보너스번호(7수) 랜덤 생성 

{

std::vector<int> vv; // vector vv 선언(중복검사, 정렬 등의 작업이 편하다) 

while(true) {

int temp = rand()%45 + 1; // 1~45 사이의 랜덤값 추출

if(std::find(vv.begin(), vv.end(), temp)==vv.end()) { // 벡터 vv 에 temp 값이 없다면 

vv.push_back(temp); // 벡터 vv 에 temp 값을 추가 

if(vv.size()==7) break; // 7수 모두를 얻었다면 while 루프를 빠져 나감 

}

}

std::sort(vv.begin(), vv.begin()+6); // 정렬(보너스번호 빼고) 

std::copy(vv.begin(), vv.end(), r); // 복사 

}


void getRandomLotto(int *r) // 로또번호(6수) 랜덤 생성 

{

std::vector<int> vv; // vector vv 선언(중복검사, 정렬 등의 작업이 편하다) 

while(true) {

int temp = rand()%45 + 1; // 1~45 사이의 랜덤값 추출

if(std::find(vv.begin(), vv.end(), temp)==vv.end()) { // 벡터 vv 에 temp 값이 없다면

vv.push_back(temp); // 벡터 vv 에 temp 값을 추가 

if(vv.size()==6) break; // 6수 모두를 얻었다면 while 루프를 빠져 나감

}

}

std::sort(vv.begin(), vv.end()); // 정렬

std::copy(vv.begin(), vv.end(), r); // 복사

}


int main(int argc, char *argv[])

srand((unsigned)time(NULL));

int r1[7]; // 랜덤으로 생성된 로또번호+보너스번호 를 저장할 배열 

for(int i=0; i<10; i++) {

getRandomLottoWin(r1);

printf("%02d,%02d,%02d,%02d,%02d,%02d / %02d\n", r1[0],r1[1],r1[2],r1[3],r1[4],r1[5],r1[6]);

}

printf("\n");


int r2[6]; // 랜덤으로 생성된 로또번호를 저장할 배열 

for(int i=0; i<10; i++) {

getRandomLotto(r2);

printf("%02d,%02d,%02d,%02d,%02d,%02d\n", r2[0],r2[1],r2[2],r2[3],r2[4],r2[5]);

}

getchar();

return 0;

}


랜덤으로 로또 번호를 생성하는 함수입니다.

getRandomLottoWin() 은 보너스볼까지 총 7수가 랜덤 생성되며

getRandomLotto() 은 총 6수가 랜덤 생성됩니다.


C 표준 랜덤함수 rand() 의 분포가 좋지 않다고는 하지만,

1~45 사이의 랜덤을 구하는 용도로는 큰 문제가 되지 않을것입니다.

(그래도 마음에 들지 않다면, 다른 랜덤 함수를 사용하면 되겠죠?)


Posted by 잇힝2012
,

lotto002.cpp

#include <stdio.h>


// 로또조합 순서값(1~8145060)으로 로또조합 알아내기

void getLottoNumberByOrderNumber(int o, int *r)

{

int sum=0,nn=0,a=0,b=0,c=0,d=0,e=0,f=0;


for(a=1; a<=40; a++) {

nn = ((45-a)*(45-a-1)*(45-a-2)*(45-a-3)*(45-a-4)) / (5*4*3*2*1);

if(sum+nn>=o) break;

sum += nn;

}


for(b=a+1; b<=41; b++) {

nn = ((45-b)*(45-b-1)*(45-b-2)*(45-b-3)) / (4*3*2*1);

if(sum+nn>=o) break;

sum += nn;

}


for(c=b+1; c<=42; c++) {

nn = ((45-c)*(45-c-1)*(45-c-2)) / (3*2*1);

if(sum+nn>=o) break;

sum += nn;

}


for(d=c+1; d<=43; d++) {

nn = ((45-d)*(45-d-1)) / (2*1);

if(sum+nn>=o) break;

sum += nn;

}


for(e=d+1; e<=44; e++) {

nn = ((45-e)) / (1);

if(sum+nn>=o) break;

sum += nn;

}


for(f=e+1; f<=45; f++) {

nn = 1;

if(sum+nn>=o) break;

sum += nn;

}


sum++;

r[0] = a;

r[1] = b;

r[2] = c;

r[3] = d;

r[4] = e;

r[5] = f;

}


int main(int argc, char *argv[])

{

int r1[6]={0,}; // 로또번호를 저장할 배열 

getLottoNumberByOrderNumber(1, r1); // 로또 순서 1번에 해당하는 로또번호를 r1 배열에 저장

int r2[6]={0,}; // 로또번호를 저장할 배열 

getLottoNumberByOrderNumber(8145060, r2); // 로또 순서 8145060번에 해당하는 로또번호를 r2 배열에 저장


printf("1 ==> %d,%d,%d,%d,%d,%d\n", r1[0],r1[1],r1[2],r1[3],r1[4],r1[5]); // 결과: 1,2,3,4,5,6

printf("8145060 ==> %d,%d,%d,%d,%d,%d\n", r2[0],r2[1],r2[2],r2[3],r2[4],r2[5]); // 결과: 40,41,42,43,44,45

getchar();

 

return 0;

}


조합 순서 번호를 이용하여 로또조합을 구하는 함수입니다.


1 을 입력하면 1,2,3,4,5,6 조합을 얻을 수 있고

8145060 을 입력하면 40,41,42,43,44,45 조합을 얻을 수 있습니다.


Posted by 잇힝2012
,

lotto001.cpp

#include <stdio.h>


// 로또 조합이 8145060 조합중 몇번째 조합인지 알아내기

int getOrderNumber(int r[])

{

int sum=0,nn=0,a=0,b=0,c=0,d=0,e=0,f=0;


for(a=1; a<r[0]; a++) {

nn = ((45-a)*(45-a-1)*(45-a-2)*(45-a-3)*(45-a-4)) / (5*4*3*2*1);

sum += nn;

}


for(b=a+1; b<r[1]; b++) {

nn = ((45-b)*(45-b-1)*(45-b-2)*(45-b-3)) / (4*3*2*1);

sum += nn;

}


for(c=b+1; c<r[2]; c++) {

nn = ((45-c)*(45-c-1)*(45-c-2)) / (3*2*1);

sum += nn;

}


for(d=c+1; d<r[3]; d++) {

nn = ((45-d)*(45-d-1)) / (2*1);

sum += nn;

}


for(e=d+1; e<r[4]; e++) {

nn = ((45-e)) / (1);

sum += nn;

}


for(f=e+1; f<r[5]; f++) {

nn = 1;

sum += nn;

}

sum++;

return sum;

}

 

int main(int argc, char *argv[])

{

int r1[6]={1,2,3,4,5,6};

int r2[6]={40,41,42,43,44,45};

printf("1,2,3,4,5,6 ==> %d\n", getOrderNumber(r1)); // 결과: 1

printf("40,41,42,43,44,45 ==> %d\n", getOrderNumber(r2)); // 결과: 8145060

getchar();

 

return 0;

}


로또번호로 몇번째 조합인지를 구하는 함수 입니다.


1,2,3,4,5,6 은 첫번째 조합

1,2,3,4,5,7 은 두번째 조합

....

40,41,42,43,44,45 은 마지막 8145060 번째 조합 입니다.



Posted by 잇힝2012
,