Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 숫자가 트로이 숫자인지 확인

<시간/>

개념

주어진 번호 n에 대해 n이 트로이 목마 번호인지 여부를 확인하는 작업입니다. 트로이 숫자는 완전하지 않은 강한 숫자로 정의됩니다. 모든 소수 또는 n의 인수 p에 대해 p^2도 제수인 경우 숫자 n은 강한 숫자로 취급된다고 말할 수 있습니다. 다른 방식으로 말하면 모든 소인자는 적어도 두 번 나타납니다. 우리는 모든 트로이 목마 숫자가 강력하다는 것을 기억해야 합니다. 그러나 그 반대의 경우도 마찬가지입니다. 즉, 모든 강력한 숫자가 트로이 목마 숫자인 것은 아닙니다. a^b로 표현할 수 없는 숫자만 해당됩니다. 여기서 b와 b는 1보다 큰 양의 정수입니다.

입력

n =7272는 6×6×2, 즉 (6^2)×2 즉, 강한 수이지만 완전한 거듭제곱은 없는 것으로 표현됩니다.

출력

입력

n =1616은 2×2×2×2 즉 2^4로 표현됩니다. 

출력

아니요

접근

먼저 각 소인수의 개수를 저장하고 개수가 2보다 크면 Strong Number인지 확인해야 합니다.

다음 단계에서는 주어진 숫자가 ^b로 표현되는지 확인해야 합니다. ^b로 표현하지 않으면 완전한 힘이라고 할 수 있습니다. 그렇지 않으면 완벽한 힘입니다. 마지막으로 마지막 단계에서 이 주어진 숫자가 완전승 없이 강하면 트로이 숫자로 취급된다는 결론을 내릴 수 있습니다.

예시

// 숫자가 트로이 목마 숫자인지 확인하는 CPP 프로그램// 트로이 목마 번호#include 네임스페이스 std;bool isPerfectPower1(int n1){ if (n1 ==1) return true; for (int x1 =2; x1 <=sqrt(n1); x1++) { int y1 =2; 정수 p1 =pow(x1, y1); while (p1 <=n1 &&p1> 0) { if (p1 ==n1) true를 반환합니다. y1++; p1 =pow(x1, y1); } } return false;}bool isStrongNumber1(int n1){ unordered_map count1; 동안 (n1 % 2 ==0) { n1 =n1 / 2; count1[2]++; } for (int i1 =3; i1 <=sqrt(n1); i1 +=2) { 동안 (n1 % i1 ==0) { n1 =n1 / i1; count1[i1]++; } } if (n1> 2) count1[n1]++; 정수 플래그1 =0; for (자동 b :count1) { if (b.second ==1) { flag1 =1; 부서지다; } } if (flag1 ==1) false를 반환합니다. else return true;}bool isTrojan1(int n1){ if (!isPerfectPower1(n1) &&isStrongNumber1(n1)) true를 반환합니다. else return false;}// 드라이버 Codeint main(){ int n1 =72; if (isTrojan1(n1)) cout <<"예"; 그렇지 않으면 cout <<"아니오"; 반환 0;}

출력