알고리즘 노트 P167 예제: [PAT A1059] Prime Factors
제목 링크
제목.
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p 1 k 1 × p 2 k 2 x ⋯ × p m k m N=p_1^{k_1}\times p_2^{k_2}x\dots\times p_m^{k_m} N=p1k1×p2k2x⋯×pmkm.
Input Specification:
Each input file contains one test case which gives a positive integer N N N in the range of long int.
Output Specification:
Factor N N N in the format N N N
=
p 1 p_1 p1 ^
k 1 k_1 k1 *
p 2 p_2 p2 ^
k 2 k_2 k2 *
…\dots … *
p m p_m pm ^
k m k_m km , where p i p_i pi's are prime factors of N in increasing order, and the exponent k i k_i ki is the number of p i p_i pi – hence when there is only one p i p_i pi, k i k_i ki is 1 and must NOT be printed out. Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
사고의 방향
단계 3과 단계 4는 질인자 분해 함수
primeFactorization
로 통합되어 코드를 구체적으로 실현한다.factors[10]
를 열어 초기화한다.primeTable
, num
에 대해 인식 분해를 하고 n = num
:a. 누적primeTable[i] > sqrt(num)
시 누적하는 것을 정지한다.b. primeTable[i]
를 정제할 수 있다면n
이 소수의 값을 factors[i].x
에 기록한다.c. 끊임없이 primeTable[i]
로 제거n
를 하고 제거할 수 없을 때까지 동시에 제거의 횟수를 통계하고 기록factors[i].exp
한다.n == 1
인식분해가 완료된 경우 sqrt(num)
보다 큰 인자가 남아 정보를 기록factors
한다.factors
에 따라 답안을 출력한다.세부 사항:
factors
는 왜 10
가 아닌 9
를 열었습니까?단계 4의 큰 인자에 위치를 남겨야 하기 때문이다.1
이 필요한 경우;num
에 직접 손을 댈 수 없으며 사본을 남겨야 한다.main
나 다른 함수에 열 수 없습니다. 그렇지 않으면 세그먼트 오류가 발생합니다.코드
#include
#include
#define MAX 50000
typedef struct {
int x, exp;
} Factor;
//
int isPrime[MAX], primeCnt = 0, primeTable[MAX/10];
int findPrime(void) {
int i, j;
for (i = 2; i < MAX; ++i)
isPrime[i] = 1;
for (i = 2; i < MAX; ++i) {
if (isPrime[i]) {
primeTable[primeCnt++] = i;
for (j = i; j < MAX; j += i)
isPrime[j] = 0;
}
}
}
// num , factors,
// num >= 2
int primeFactorization(int num, Factor *factors) {
int i, n = num; // n num
int factorCnt = 0;
for (i = 0; i < 10; ++i)
factors[i].exp = 0;
for (i = 0; i < primeCnt; ++i) {
if ((int)sqrt((double)num) < primeTable[i])
break;
if (n % primeTable[i] == 0) {
factors[factorCnt].x = primeTable[i];
while (n % primeTable[i] == 0) {
n /= primeTable[i];
++factors[factorCnt].exp;
}
++factorCnt;
}
}
if (n != 1) {
factors[factorCnt].x = n;
factors[factorCnt].exp = 1;
++factorCnt;
}
return factorCnt;
}
int main() {
findPrime(); //
int num, i;
scanf("%d", &num);
if (num == 1) { //
printf("1=1");
return 0;
}
//
Factor factors[10];
int factorCnt = primeFactorization(num, factors);
//
int flag = 0;
printf("%d=", num);
for (i = 0; i < factorCnt; ++i) {
if (flag)
putchar('*');
flag = 1;
printf("%d", factors[i].x);
if (factors[i].exp > 1)
printf("^%d", factors[i].exp);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
leetcode 스크립트 일기의 검증 두 갈래 검색 트리두 갈래 나무를 정해 효과적인 두 갈래 검색 나무인지 아닌지를 판단한다. 두 갈래 검색 트리에는 다음과 같은 정의가 있습니다. 예 1: 두 갈래 나무[2,1,3],true로 돌아갑니다. 예 2: 두 갈래 나무[1,2...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.