给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即
N=p1^k1*p2^k2*…*pm^km
,其中pi
为素因子并要求由小到大输出,指数ki
为pi
的个数;当ki
为1即因子pi
只有一个时不输出ki
。输入样例:
1323
输出样例:
1323=3^3*7^2
思路:求因子直接暴力,从2 跑到sqrt(x),不然绝对超时,随后利用map记录答案的同时,还能对答案进行排序,思路清晰。
坑点:注意1的情况, 虽然1不是素数,但是有测试点需要输出“1=1”的情况。
数据范围long int 注意开 long long 防止爆int
C++代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool isSu(int x){//简单判断素数函数
if(x<=1)return false;
for(int i=2;i<=sqrt(x);i++)if(x%i==0)return false;
return true;
}
map<int,int>mp;
signed main(){
int n;cin>>n;
int tmp = n;
for(int i=2;i <= sqrt(tmp); i++){// 1不是素数,所以从2开始,tmp要实时更新,
if( tmp % i==0 && isSu(i)){//当前能被tmp整除,并且是素数
mp[i]++;//记录答案
tmp /= i;//tmp记得要除掉,不然答案乘起来会错。
i=1;//将i置为1,结束本次循环后i会++,所以下一次新的循环又会从2开始
}
}
mp[tmp]++;// 例如 49 的情况,除到剩7,进不了循环,所以记得加上最后一个因子
cout << n << "=";
int f = 0;
for(auto it:mp){
if( f != 0 )cout<<"*";
f=1;
if( it.second > 1 ) cout << it.first << "^" << it.second;
else cout << it.first ;
}
return 0;
}