For Loop를 사용한 JAVA 프로그램의 Armstrong Number
⚡ 스마트 요약
암스트롱 수는 각 자릿수의 합을 해당 자릿수만큼의 거듭제곱으로 나타낸 값과 같으며, 두 개의 Java 아래 프로그램들은 단일 값을 확인하고 1000 미만의 모든 암스트롱 수를 나열합니다.
암스트롱 수란 무엇인가?
암스트롱 수에서 각 숫자의 거듭제곱의 합은 숫자 그 자체와 같습니다.
즉, 다음 방정식이 성립합니다.
xy..z = xn + yn+.....+ zn
n은 숫자의 자릿수입니다.
예를 들어 이것은 3자리 Armstrong 숫자입니다.
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Armstrong의 예 Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
0부터 9까지의 모든 한 자릿수 값은 한 자릿수를 1제곱하면 자기 자신이 되기 때문에 이 규칙을 자명하게 만족합니다. 세 자릿수 암스트롱 수는 153, 370, 371, 407이고, 네 자릿수 암스트롱 수는 1634, 8208, 9474입니다. 수학자들은 이러한 수들을 각각의 자릿수로 자기 자신을 복제하기 때문에 '자기 복제 수'라고도 부릅니다.
이것을 프로그램에 작성해 봅시다:
암스트롱 수 알고리즘의 작동 원리
코드를 읽기 전에 두 프로그램이 반복하는 연산을 살펴보는 것이 도움이 됩니다. 검사에는 세 가지 연산만 필요합니다. 마지막 자릿수를 제거하고, 필요한 거듭제곱을 하고, 숫자를 한 자릿수 줄입니다.
- 입력값을 작업 영역에 복사하세요 변수 따라서 원래 값이 최종 비교에 사용됩니다.
- 나머지 연산자를 사용하여 마지막 자릿수를 취합니다.
digit = tempNumber % 10. - 해당 자릿수를 자릿수만큼 거듭제곱하고 누적 합계에 더합니다.
- 정수 나눗셈에서 마지막 자릿수를 버립니다.
tempNumber /= 10. - 작업 변수가 0이 될 때까지 이 과정을 반복한 다음, 누적 합계를 원래 값과 비교합니다.
153에 대해 이러한 단계를 실행하면 다음과 같은 결과가 나옵니다. trac아래 e를 참조하세요. 표의 모든 값은 첫 번째 프로그램에서 출력되므로, 반복문을 학습하는 동안 출력 결과를 한 줄씩 비교해 볼 수 있습니다.
| 패스 | 임시 번호 | 손가락 | digitCubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| 출구 | 0 | - | 153은 153과 같으므로 153은 암스트롱 수입니다. |
한 가지 중요한 제한 사항입니다. 두 프로그램 모두 자릿수를 세 번 곱하는데, 이는 입력값이 정확히 세 자리 숫자일 때만 올바른 거듭제곱입니다. 일반적인 규칙은 각 자릿수를 n제곱하는 것인데, 여기서 n은 자릿수의 개수입니다. 따라서 8208과 같은 네 자리 값은 4제곱이 필요하며, 세제곱 기반 코드에서는 이를 놓칠 수 있습니다. 자릿수를 먼저 세고 각 자릿수를 해당 제곱으로 나타내는 방식이 루틴을 일반적인 테스트로 만들어 줍니다.
연산이 완료되면 첫 번째 프로그램은 이를 하드코딩된 단일 값에 적용합니다.
Java 숫자가 Armstrong 숫자인지 확인하는 프로그램
아래 클래스는 후보자를 저장합니다. inputArmstrongNumber 그리고 매 단계마다 작업 변수를 출력하므로, Java 콘솔에서 따라하기 쉬운 반복문입니다.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int inputArmstrongNumber = 153; //Input number to check armstrong int tempNumber, digit, digitCubeSum = 0; tempNumber = inputArmstrongNumber; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ System.out.println("Current Number is "+tempNumber); digit =tempNumber % 10; System.out.println("Current Digit is "+digit); //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit*digit*digit; System.out.println("Current digitCubeSum is "+digitCubeSum); tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if(digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); else System.out.println(inputArmstrongNumber + " is not an Armstrong Number"); } }
프로젝트 루트에서 클래스를 컴파일하고 실행하세요. 파일에 다음과 같이 선언되어 있기 때문입니다. package com.guru99그러므로, 그것은 일치하는 곳에 놓여 있어야 합니다. com/guru99 폴더가 잘못되었거나 런타임 시 클래스를 찾을 수 없다는 오류가 발생했습니다. 값을 변경하면 inputArmstrongNumber 다른 후보자를 테스트하는 데 필요한 것은 단 한 줄뿐입니다.
산출
Current Number is 153 Current Digit is 3 Current digitCubeSum is 27 Current Number is 15 Current Digit is 5 Current digitCubeSum is 152 Current Number is 1 Current Digit is 1 Current digitCubeSum is 153 153 is an Armstrong Number
한 번에 하나의 값만 확인하는 것은 다음과 같은 경우에 유용합니다. trac하지만 동일한 논리가 래핑을 통해 전체 범위로 확장됩니다.ping 외부 루프에 넣어주세요.
Java 0~999까지의 Armstrong 숫자를 인쇄하는 프로그램
두 번째 버전은 내부 구성이 동일합니다. while 루프를 실행하고 추가합니다. for 범위를 순회하는 루프입니다. 참고하세요. digitCubeSum 매 패스마다 시작 부분에서 0으로 재설정되는데, 이는 초보자들이 가장 많이 잊어버리는 부분입니다.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int tempNumber, digit, digitCubeSum; for (int inputArmstrongNumber = 0; inputArmstrongNumber < 1000; inputArmstrongNumber++) { tempNumber = inputArmstrongNumber; digitCubeSum = 0; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ digit = tempNumber % 10; //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit * digit * digit; tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if (digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); } } }
산출
0 is an Armstrong Number 1 is an Armstrong Number 153 is an Armstrong Number 370 is an Armstrong Number 371 is an Armstrong Number 407 is an Armstrong Number
목록이 9까지 이어지지 않고 1에서 멈추는 이유는 한 자릿수의 세제곱이 0과 1에 대해서만 해당 자릿수와 같기 때문입니다. 각 자릿수를 자릿수 개수만큼 거듭제곱하면 앞서 설명한 일반화와 동일하게 10개의 한 자릿수 값을 모두 반환하게 됩니다.
두 목록 모두 벤치마킹하기에 충분히 짧으므로, 이 접근 방식의 비용을 명확하게 언급할 가치가 있습니다.
암스트롱 수 프로그램의 시간 및 공간 복잡도
내부 루프는 매 반복마다 작업 변수를 10으로 나누므로, 숫자의 단위마다 한 번씩이 아니라 자릿수마다 한 번씩 실행됩니다. 이로 인해 단일 값 검사가 매우 저렴해지고, 입력값이 증가하더라도 저렴한 비용이 유지됩니다.
| 프로그램 | 시간 복잡성 | 공간 복잡성 |
| 숫자 하나를 선택하세요 | O(d), 여기서 d는 자릿수입니다. | O (1) |
| N개의 숫자로 이루어진 범위를 스캔합니다. | O(N × d) | O (1) |
d는 log와 같기 때문입니다.10(숫자)를 반올림하면 단일 검사는 테스트 대상 값에 대해 실질적으로 로그 함수가 됩니다. 단 세 개만 필요합니다. int 변수는 전혀 할당되지 않고 배열이나 컬렉션도 생성되지 않기 때문에 범위가 아무리 커지더라도 공간 비용은 일정하게 유지됩니다.
이로부터 두 가지 실질적인 사항을 알 수 있습니다. 첫째, 범위 스캔은 N에 의해 좌우되므로 암스트롱 수를 백만까지 인쇄하는 비용은 천까지 인쇄하는 비용보다 대략 천 배 더 많이 듭니다. 둘째, int 2,147,483,647을 초과하면 오버플로가 발생하므로 매우 넓은 범위에 걸쳐 검색하려면 long 후보자와 누적 합계 모두에 대해. 동일한 숫자-예trac이러한 패턴은 초보자 연습 문제에서 많이 나타납니다. 소수 검사 밸리 피보나치 시리즈 프로그램 및 배열 연습과 같은 버블 정렬 삽입 정렬.
