今天练习了下,当是复习vector和map....
代码很简单不过挺有用
- #include <iostream>
- #include <vector>
- #include <map>
- using namespace std;
- #define PRI_ERROR {cout<<"数据输入出错/n数据范围:2~1000000的整数"<<endl;continue;}
- #define GET_PRIMES for(i=2;i<=1000;i++)if(!pri[i]){p.push_back(i);for(j=i;j*i<=1000000;j++)pri[i*j]=true;}
- bool pri[1000001]={true,true};
- typedef vector<int> VI;
- map<int,int> factor;
- map<int,int>::iterator f;
- int arr[22][2];
- VI p,fac;
- int main()
- {
- int i,j,n,tmp,kind,l;
- GET_PRIMES
- while(cin>>n)
- {
- kind=1;
- factor.clear();
- fac.clear();
- if(n<2||n>1000000) PRI_ERROR;
- if(!pri[n]) {cout<<"提示:该数为素数."<<endl<<"因子个数:2/n分别为:1 "<<n<<endl;continue;}
- tmp=n;
- for(i=l=0;i<p.size();i++)
- {
- if(tmp%p[i]==0)
- arr[l++][0]=p[i],arr[l-1][1]=0;
- while(tmp%p[i]==0)
- tmp/=p[i],arr[l-1][1]++;
- if(tmp==1) break;
- if(!pri[tmp]) {arr[l][0]=tmp,arr[l++][1]=1;break;}
- }
- for(i=0;i<l;i++) {kind*=(arr[i][1]+1);for(j=0;j<arr[i][1];j++) fac.push_back(arr[i][0]);}
- cout<<"因子个数:"<<kind<<endl;cout<<"分别为:1 ";
- for(i=1;i<(1<<fac.size());i++)
- {l=1;for(j=0;j<fac.size();j++)if(i&(1<<j))l*=fac[j];if(l<=n)factor[l]=1;}
- f=factor.begin();
- while(f!=factor.end())
- {
- cout<<f->first;
- f++;
- if(f!=factor.end()) cout<<' ';
- else cout<<endl;
- }
- }
- }