1. 우박수 코드화(콜라츠 추측)
https://namu.wiki/w/%EC%BD%9C%EB%9D%BC%EC%B8%A0%20%EC%B6%94%EC%B8%A1
콜라츠 추측 - 나무위키
콜라츠 추측이 풀기 어려운 이유를 알려면 일단 이거부터 알아야 된다. 점근 표기법은 O(f(x))의 형식으로 표기되며 영어로는 Big O notation이다. O(f(x))=g(x)가 의미하는 바는 f(x)에 비해 g(x)의 값이 일정 범위 내에서 항상 같거나 떨어진다는 것이다. 콜라츠 추측은 이 Big O notation에 의한 분류에서 야생 함수로 분류된다. 그리고 야생 함수이기 때문에 헬게이트가 오픈된다. 증가율이 항상 높기 때문. 이것 때문에 심지
namu.wiki
https://terms.naver.com/entry.nhn?docId=3568350&cid=58944&categoryId=58970
우박수의 신비
수학의 역사는 수학자들이 어려운 문제들을 풀기 위해 벌여온 사투의 기록이라 할 수 있다. 이 과정에서 새로운 개념, 놀라운 아이디어가 등장하고, 여기서 다시 파생된 문제에 도전하는 과정이 끊임 없이 반복된다. 수학에서 어려운 문제란 문제가 무엇인지 이해하기도 힘든 경우가 대부분이지만, 초등학생도 이해할 수 있는 문제이면서도 전혀 해결의 실마리가 보이지 않는 문제도 드물지 않다. [ 콜라츠의 추측, 3n+1 문제, 우박수 ] 1937년, 박사 학위를 받은
terms.naver.com
이걸 보면 대충 무슨 의미일 것인지 아니깐 생략.
간단히 얘기하면, 어떤 숫자든 짝수는 2 나누고 홀수일 경우 3곱한 후 1 더하는 짓거리를 반복하면,
어떤 수 a -> '우박수 계산짓' -> '우박수 계산짓' -> ... -> '우박수 계산짓' -> 1
이렇게 1로 귀결된다는 것이다.
코드로 정리하면 다음과 같다.
int n = 14; // 아무 숫자나 넣어도 됨.
int k = 0; // 카운팅용
while (true) {
if (n % 2 != 1) { //짝수면?
n = n / 2; //2나누고 다시 위로 보내
} else { // 아니면?(=홀수면?)
n = n * 3 + 1; // 3 곱하고 1 더해 위로 보내
}
System.out.println(n); // 계산 한 번 할때마다 출력
k++; //몇 번 계산했는지 확인 위해 카운팅
if (n == 1) { // 마침내 1이 되면?
break; // 끝!
} else {
continue;
}
}
System.out.println("실행 횟수: " + k);
컴퓨터는 이 미제의 답을 알고 있을까...
사람이 알지 못하는 법칙도 자알 실행되는 것도 참 신기하다.
2. Math.Random()의 활용문제.
Math.Random()는 0~0.9까지의 수를 컴터 멋대로 뱉어내는 메소드이다.
보통 인생 역전을 꿈꾸는 숫자를 컴터에 의지하고 싶을 때
우린 다음과 같이 해야 원하는 대로 뱉어낸다.
// 1~45숫자 6개 출력!
int[] number = new int[6];
System.out.print("로또숫자: ");
for (int i = 0; i < 6; i++) { //배열에 랜덤짓한 숫자 6번 넣기
number[i] = (int) (Math.random() * 45 + 1); //casting
System.out.print(number[i]+" | "); // 숫자 하나씩 출력
}
우리가 원하는 수는 대부분이 정수이기 때문에, integer로 대부분 casting 하는 것을 쓸 것이다.
여기서 선생님은 다음과 같은 조건 하에 랜덤 숫자를 내도록 문제를 주셨다.
1. 100~999 숫자 중 중복되는 숫자(ex. 333, 442, 393) 안 나오게 출력
2. 배열 사용하지 말 것.(으악)
int a = 0;
int ct = 0;
int ctNum = 0;
while (true) {
int k = ((int) (Math.random() * 900) + 100);
int k100 = k / 100;
int k10 = k / 10 % 10;
int k1 = k % 10;
if (k100 == k10 || k10 == k1 || k100 == k1) {
ct++;
continue;
} else {
System.out.println(k);
ctNum++;
}
if (ctNum == 10) {
break;
}
} // while
System.out.println("중복 숫자 삭제 횟수: " + ct);
'Java > Learn_Java' 카테고리의 다른 글
Java의 비트 연산자 이용법 (0) | 2020.04.13 |
---|---|
6. 클래스_연습문제(은행 계좌) (0) | 2020.04.05 |
5. 참조 타입_연습문제 (0) | 2020.04.05 |
5. 참조 타입 (0) | 2020.03.29 |
4. 조건문과 반복문_활용문제 (0) | 2020.03.29 |