본문 바로가기
JAVA 줘? 잡아줘!

[JAVA]Day005_원의면적 / GCD,LCM / 피보나치 문제

by Boxseo 2023. 8. 17.
//2번 문제 : r=10.0인 원의 면적을 구하시오.  / 원의면적=반지름*반지름*3.14
float r = 10.0f;
final float PI = 3.14f;
double area = r*r*PI;
System.out.println("\n\n2번 문제");
System.out.println("원의 %n면적은 : "+area);

딱히 볼 필요 없는 예제...

final 로 선언했다는 정도??

근데 그게 의미가 있나... .언젠간 쓰겠지 뭐

 

 

//3번 문제 : 최대공약수(Greatest Common Divisor), 최소공배수(Least Common Multiple)
		System.out.println("\n3번 문제");
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 정수값 입력 : ");
		int x = sc.nextInt();
		System.out.print("두번째 정수값 입력 : ");
		int y = sc.nextInt();
		sc.close();
		
		System.out.print("입력한 두 숫자의 공약수는 :");
		int i, gcd=0;		
		for(i=1;i<=x;i++) {
			if(x%i==0 && y%i==0) {
				gcd=i;
				System.out.printf(" %d ",i);				
			}				
		}
		System.out.printf("이고,\n최대공약수는 %d 이다",gcd);
		int lcm = x*y/gcd;
		System.out.printf("\n최소공배수는 %d이다.",lcm);

개념은 다 아리라 생각하고~ 아 참 GCD / LCM 은 외워두면 좀 있어 보일거 같다.

대충 원리는 이러하다

i=1 부터 입력한 숫자까지 자연수만 ++ 해서 나머지가 0 인 %==0 값들을 토출해내는 구조인데

실수로 1과 자기 자신을 범위에서 빼는 일이 없도록 하자

 

최소공배수 구할 때 key point 는 두수를 곱해서 최대공약수로 나누면 최대공약수라는 것이다.

증명이 필요하다면 연락을 달라. 난 외울 거니깐!?

//4번 문제 : 피보나치 수열		
		//	1	2	3	4	5	6	7	8	9		10
		//	0	1	1	2	3	5	8	13	21		34
        
		int prev=0, now=1, next=1, n; 
        Scanner sc = new Scanner(System.in);
		System.out.print("피보나치 몇번째를 원하는가? : ");
		int z = sc.nextInt();
		sc.close();
		
		if(z>=1) {System.out.printf("%d",prev);}
		if(z>=2) {System.out.printf("\t%d",now);}
		if(z>=3) {
			for(n=3;n<=z;n++) {			
				prev=now;
				now=next;			
				next=now+prev;
				System.out.printf("\t%d",now);
            }
        }

마지막 문제 피보나치 수열 구하기

블로그 따라 0,1 로시작하거나 1,1로 시작하거나 차이는 있더라만 알고리듬은 같다고 본다

 

처음엔 번째를 입력하면 거기에 맞는 수가 나오도록 했는데 그러면 앞부분이 맞는지 확인이 안되서 열거하도록 수정!!!

여튼!?

 

난 왠지 모르게 포인터(?)의 개념으로 접근해졌다. prev / now / next 의 각각의 화살표가 옮겨간다는 그림이 떠올랐다

next = now + prev; 인데, 원하는 값이 먼지에 따라 이 줄이 앞에 갈 지, 뒤에 갈지 다르니 궁금하면 [ctrl]+[F11] 눌러라.

n=1 일 떄가 첫 묶음이 생기는 데, prev=0; now=1; next=1; 인 상황이다. 묶음의 시각으로 보면 첫 번째 지만, 숫자의 시각으로 바라보면 3번째 숫자까지 나오기 때문에, 묶이지 않는 앞의 0, 1 의 경우는 강제로 선언되게 만들었다.

 

코드 보면 알겠지만, z 가 그 숫자의 번째를 뜻하는데

z>=1; z>=2; z>=3 의 구조로 짰기에, 내림차순으로 읽혀지면서 반복되도록 짰다.

무슨 말이냐면, 1일 땐 첫번째 if 만 돌게, 2일 땐 첫번째 if, 두번째 if 돌게, 3이상일 땐 셋다 돌게 만들 었다는 것이다

우하하하

이렇게 소스가 짧아졌을 때 얼마나 짜릿하던지!!!!

 

여기저기 자랑 했는데, 하지말고 나만 알 걸 그랬나 싶지만, 뭐... 다 같이 잘 되면 재밌잔하

 

영민상 정한상 빚 갚으쇼~