반응형
아마도 많은 대학 과제가 로또 번호 생성하는 것인 듯 합니다.
로또 번호를 생성하기 위해서는 배열을 잡고, 그 안에 랜덤 생성한 숫자를 넣는 방법이 있겠지만, 이 방법은 중복 검사를 하기 위해서도 매번 배열의 모든 값을 찾아봐야한다는 단점이 있습니다.
void GenLotto(int n[6]) { int i, j, c; for( i = 0 ; i < 6 ; i++ ) { do { c = rand()%45; for( j = 0 ; j < i ; j++ ) { if( n[j] == c ) break; } } while( j < i ); n[i] = c; }
이 방법이 나쁘다는 것만은 아닙니다.
그러나 루프 안에 루프, 또 루프.. 프로그램 자체가 보기 안 좋죠.
그래서 제 경우에는 메모리를 많이 쓰더라도 보다 간단한 알고리즘으로 생성하는 방법을 씁니다.
그래서 만든 프로그램이 다음과 같습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void GenLotto(int n[45]); void main() { int isInLotto = 0; int isBonus = 0; int lotto[45]; int i, n; GenLotto(lotto); for( i = 0 ; i < 6 ; i++ ) { printf("Enter %dth number : ", i+1); scanf("%d", &n); if( lotto[n-1] ) isInLotto++; } printf("Enter bonus number : "); scanf("%d", &n); if( lotto[n-1] ) isBonus = 1; printf("Computer lotto number\n"); for( i = 0 ; i < 45 ; i++ ) { if( lotto[i] ) printf("%d ", i+1); } printf("\n"); printf("Result : "); if( isInLotto == 6 ) printf("1st"); else if( isInLotto == 5 && isBonus ) printf("2nd"); else if( isInLotto == 5 ) printf("3rd"); else if( isInLotto == 4 ) printf("4th"); else if( isInLotto == 3 ) printf("5th"); else printf("none"); printf("\n"); } void GenLotto(int n[45]) { int i; srand(time(0)); for( i = 0 ; i < 45 ; i++ ) n[i] = 0; for( i = 0 ; i < 6 ; i++ ) { while( 1 ) { int c = rand()%45; if( n[c] == 0 ) { n[c] = 1; break; } } } }
아울러 위 소스를 실행해서 얻을 결과는 다음과 같습니다.
728x90
'Programming > C++' 카테고리의 다른 글
초성 표시하기 (0) | 2014.12.26 |
---|---|
마크로를 이용해서 문자열 찍기 (0) | 2014.12.02 |
문자열 처리 (0) | 2014.09.26 |
C++로 문자열 입력받아서 출력 변환하기.. (2) | 2014.09.24 |
C/C++ 에서 변수 선언자의 위치에 따른 차이 (0) | 2014.03.11 |
댓글