PAT甲级 A1059
题目详情
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pm^km.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int.
Output Specification:
Factor N in the format N = p1k1p2k2…*pm^km, where pi’s are prime factors of N in increasing order, and the exponent ki is the number of pi – hence when there is only one pi, ki is 1 and must NOT be printed out.
Sample Input:
97532468
Sample Output:
97532468=2^211171011291
解题思路
这道题看似复杂,实际上就是求乘积为该数的数从小到大的排列,此时采用一次循环可以解决,使得除数从2开始,若相除无余数则将其入向量,除数继续从当前位置开始,更新被除数,否则就增大除数。在得到所有的除数后从小到大排列,若存在多个相同数字相乘时采用指数的形式表示
以下为AC代码
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<memory.h>
#include<string>
#include<algorithm>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>;
using namespace std;//避免超时(查找栈内中位数)
int main(){
long int N; cin >> N;
long int temp = N;
if (N == 1) {
cout << "1=1" << '\n';
return 0;
}
vector<long int> factors;
long int last = 2;
while(true){
if (last>temp) {
break;
}
else {
if (temp % last == 0) {
factors.push_back(last);
temp = temp/last;
}
else {
last++;
}
}
}
long int nos = 0;
cout << N << "=";
for (long int i = 0; i < factors.size(); i++) {
if (i == factors.size() - 1) {
nos++;
if (nos == 1) {
cout << factors[i] << '\n';
}
else {
cout << factors[i] << "^" << nos << '\n';
}
}
else {
nos++;
if (factors[i] != factors[i + 1]) {
if (nos == 1) {
cout << factors[i] << "*";
}
else {
cout << factors[i] << "^" << nos << "*";
}
nos = 0;
}
else {
continue;
}
}
}
}