打表筛选素数(打表的范围不必很大,否则会造成内存的溢出)
过大的数本身应该就会有比较小的素数为其因子,如果没有,判定其为素数;
第二个是可能留下的商也很大,处理方法同上
满分代码如下:
#include<bits/stdc++.h> using namespace std; const int max_num=1e5; vector<int>ve(max_num,1); vector<int>pri; //埃氏筛选法,素数打表 void is_prime(){ for(int i=2;i<max_num;i++){ if(ve[i]){ pri.push_back(i); for(int j=i+i;j<max_num;j+=i){ ve[j]=0; } } } } map<int,int>mp; int n; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; if(n==1){ cout<<"1=1"<<endl; return 0; } is_prime(); cout<<n<<"="; for(int i=0;i<pri.size();i++){ while(n%pri[i]==0){ mp[pri[i]]++; n/=pri[i]; } if(n==1) break; } map<int,int>::iterator it=mp.begin(); int flag=0; for(;it!=mp.end();it++){ if(flag) cout<<"*"; flag=1; cout<<it->first; if(it->second==1) continue; else cout<<"^"<<it->second; } if(flag==0){// 不在打表内的素数 (本身是素数) cout<<n<<endl; return 0; } if(n>1){//不在打表内的素数 (除下的是素数) cout<<"*"<<n<<endl; } return 0; }