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
×⋯×p
m
k
m
.
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 = p
1
^k
1
*p
2
^k
2
*…*p
m
^k
m
, where p
i
's are prime factors of N in increasing order, and the exponent k
i
is the number of p
i
-- hence when there is only one p
i
, k
i
is 1 and must NOT be printed out.
Sample Input:
97532468
结尾无空行
Sample Output:
97532468=2^2*11*17*101*1291
结尾无空行
经典的素数筛法
测试点3不过的朋友可以看看自己是不是没有对输入值为0和1的特殊处理(不过话又说回来,0和1不是素数,那么输入值为0和1的时候素因数是什么呢?又怎么输出呢?结果你告诉我这两种情况的时候输出0和1,这不是脑残吗?我严重怀疑这些出题的老师纯粹就是为了难而难,还故意不告诉你没有质因数的情况该怎么输出)
这道题还有一个出错的点,那就是在init()素数表中需要将j声明为long long,又或是添加一句if(i >= 1000)continue,出错的原因在于i为100001时i * i会超过int。可以添加一句if(i >= 1000)continue的原因是1000后面的mark已经处理好了
#include <iostream>
#include <vector>
using namespace std;
int prime[100001];
int primesize;
bool marked[100001];
void init(){
primesize = 0;
for(long long i = 2;i < 100001;++i){
marked[i] = false;
}
for(long long i = 2;i < 100001;++i){
if(marked[i] == true){
continue;
}
prime[primesize++] = i;
for(long long j = i * i;j < 100001;j += i){
marked[j] = true;
}
}
}
int main(){
init();
long long n;
cin >> n;
if(n == 1||n == 0){
cout << n << '=' << n << endl;
return 0;
}
long long ori = n;
vector<long long> base;
vector<long long> exponent;
for(int i = 0;i < primesize;++i){
int temp = prime[i];
if(n % temp == 0){
int count = 0;
base.push_back(temp);
while(n % temp == 0){
n /= temp;
count++;
if(n == 1){
break;
}
}
exponent.push_back(count);
}
}
if(n != 1){
base.push_back(n);
exponent.push_back(1);
}
cout << ori << '=';
for(int i = 0;i < base.size();++i){
cout << base[i];
if(exponent[i] != 1){
cout << '^' << exponent[i];
}
if(i != base.size() - 1){
cout << '*';
}
}
cout << endl;
return 0;
}