题目
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N=p1k1×p2k2×⋯pmkm.
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=p1k1×p2k2×⋯×pmkm, where {p_i}'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^2*11*17*101*1291
题目大意
输出一个数的所有质因子。
思路
求质数还是采用常规方法,只是判断的范围可以动态变化,有这样的规律,当前因子为k
则计算下一个因子从k
开始,并且定义一个临时变量t
,t
等于已求出因子的乘积,那么判断的上限就是n/t
。
代码
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
using namespace std;
bool isPrime(int x){
for(int i=2; i<=sqrt(x); i++){
if(x%i == 0)
return false;
}
return true;
}
int main(){
map<int,int> mp;
int n;
scanf("%d", &n);
int cnt = 2, t = n;
while(t > 1){
for(int i=cnt; i<=t; i++){ // 上下限动态变化
if(isPrime(i) && t%i == 0){
t /= i;
cnt = i;
//printf("%d\n", i);
map<int,int>::iterator it = mp.find(i);
if(it != mp.end())
mp[i]++;
else
mp[i] = 1;
break;
}
}
}
printf("%d=", n);
for(map<int,int>::iterator it=mp.begin(); it!=mp.end(); it++){
if(it != mp.begin())
printf("*");
printf("%d", it->first);
if(it->second > 1)
printf("^%d", it->second);
}
if(mp.empty())
printf("%d", n);
printf("\n");
return 0;
}
李小白~
发布了69 篇原创文章 · 获赞 35 · 访问量 1万+
私信
关注