For Loop를 사용한 JAVA 프로그램의 Armstrong Number

⚡ 스마트 요약

암스트롱 수는 각 자릿수의 합을 해당 자릿수만큼의 거듭제곱으로 나타낸 값과 같으며, 두 개의 Java 아래 프로그램들은 단일 값을 확인하고 1000 미만의 모든 암스트롱 수를 나열합니다.

  • 🔘 정의: n자리 숫자의 경우, 각 자릿수를 n제곱한 다음 그 결과를 모두 더합니다.
  • ☑️ 실제 예제: 370은 3³ 더하기 7³ 더하기 0³이 정확히 370이므로 조건을 만족합니다.
  • Digi티 엑스tracTION : 나머지 연산자는 마지막 자릿수를 제거하고, 정수 나눗셈은 매 단계마다 숫자를 짧게 만듭니다.
  • 🧪 두 가지 프로그램: 하나는 하드코딩된 값 153을 테스트하고, 다른 하나는 0부터 999까지의 모든 숫자를 순회합니다.
  • 🛠️ 알려진 한계: 각 자릿수를 세제곱하는 방법은 세 자릿수 값에만 적용되므로, 더 넓은 범위의 값에는 n의 거듭제곱이 필요합니다.
  • 📊 복잡성: 두 프로그램 모두 숫자당 O(d) 시간 내에 실행되고 O(1) 추가 메모리를 사용합니다.

암스트롱 번호 Java for 루프를 사용하는 프로그램

암스트롱 수란 무엇인가?

암스트롱 수에서 각 숫자의 거듭제곱의 합은 숫자 그 자체와 같습니다.

즉, 다음 방정식이 성립합니다.

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입니다. 수학자들은 이러한 수들을 각각의 자릿수로 자기 자신을 복제하기 때문에 '자기 복제 수'라고도 부릅니다.

이것을 프로그램에 작성해 봅시다:

암스트롱 수 알고리즘의 작동 원리

코드를 읽기 전에 두 프로그램이 반복하는 연산을 살펴보는 것이 도움이 됩니다. 검사에는 세 가지 연산만 필요합니다. 마지막 자릿수를 제거하고, 필요한 거듭제곱을 하고, 숫자를 한 자릿수 줄입니다.

  1. 입력값을 작업 영역에 복사하세요 변수 따라서 원래 값이 최종 비교에 사용됩니다.
  2. 나머지 연산자를 사용하여 마지막 자릿수를 취합니다. digit = tempNumber % 10.
  3. 해당 자릿수를 자릿수만큼 거듭제곱하고 누적 합계에 더합니다.
  4. 정수 나눗셈에서 마지막 자릿수를 버립니다. tempNumber /= 10.
  5. 작업 변수가 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이러한 패턴은 초보자 연습 문제에서 많이 나타납니다. 소수 검사 밸리 피보나치 시리즈 프로그램 및 배열 연습과 같은 버블 정렬 삽입 정렬.

자주 묻는 질문

네. 각 자릿수를 세제곱하면 27 + 343 + 1이 되어 371이 되므로 값이 자기 복제됩니다. 위의 범위 프로그램은 153, 370, 407과 함께 이 값을 출력합니다.

이름은 그 속성 자체를 반영합니다. 숫자가 모두 자기 자신의 자릿수로만 이루어져 있기 때문에 마치 자기 모습을 찬탄하는 것처럼 보입니다. 두 용어 모두 동일한 규칙을 설명하며, 자릿수 거듭제곱의 합은 때때로 완전수 불변량이라고도 불립니다.

세 가지 경우가 있습니다. 1634, 8208, 9474입니다. 값이 네 자리 숫자이므로 각 자릿수는 네제곱으로 표현됩니다. 세제곱 기반 코드는 이를 감지할 수 없기 때문에 지수는 반드시 자릿수와 같은 순서로 와야 합니다.

완전수는 그 수의 진약수의 합과 같으므로, 6은 1 + 2 + 3으로 완전수에 해당합니다. 암스트롱 수는 각 자릿수의 거듭제곱의 합과 같습니다. 이 두 정의는 산술적으로 공통점이 없으며, 겹치는 경우도 드뭅니다.

Math.pow()는 double형 값을 반환하므로 int형으로 형변환해야 하며, 이 과정에서 반올림 오류가 발생할 수 있습니다. 세제곱수가 고정된 경우에는 digit*digit*digit 방식이 더 빠르고 정확합니다. Math.pow()는 지수가 자릿수에 따라 변하는 경우에만 유용합니다.

네. 헬퍼 메서드는 작업 값을 받아서 마지막 자릿수의 거듭제곱을 누산기에 더한 다음, 그 숫자를 10으로 나눈 값을 반환하면서 자기 자신을 호출할 수 있습니다. 코드가 읽기 쉽지만, 반복문을 사용하는 방식은 스택 프레임을 추가로 생성하지 않아 편리합니다.

최신 보조 시스템은 단계별 경로를 생성할 수 있습니다. trace. 반복문을 일반적인 언어로 다시 작성하고 0이나 음수 입력과 같은 예외 상황을 제시하십시오. 이를 검증하십시오. trac실제 콘솔 출력과 다르기 때문입니다. 생성된 공략은 때때로 반복 과정을 건너뛰기 때문입니다.

GitHub 부조종사 일반적으로 메서드 이름만으로 루프를 완료할 수 있지만, 종종 큐브 값을 하드코딩하는 경우가 있습니다. 프롬프트에 필요한 자릿수를 명시한 다음, 제안된 결과를 컴파일하고 테스트한 후 신뢰하십시오.

이 게시물을 요약하면 다음과 같습니다.