求2~1000000内的数字的因子

本文介绍了一个使用 C++ 编写的简单程序,用于找出指定范围内整数的所有素数,并计算给定整数的所有因子及其数量。通过筛法求取素数,并利用 vector 和 map 数据结构来存储和展示结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天练习了下,当是复习vector和map....

代码很简单不过挺有用

 

  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. using namespace std;
  5. #define PRI_ERROR {cout<<"数据输入出错/n数据范围:2~1000000的整数"<<endl;continue;}
  6. #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;}
  7. bool pri[1000001]={true,true};
  8. typedef vector<int> VI;
  9. map<int,int> factor;
  10. map<int,int>::iterator f;
  11. int arr[22][2];
  12. VI p,fac;
  13. int main()
  14. {
  15.     int i,j,n,tmp,kind,l;
  16.     GET_PRIMES
  17.     while(cin>>n)
  18.         {
  19.           kind=1;
  20.           factor.clear();
  21.           fac.clear();
  22.           if(n<2||n>1000000) PRI_ERROR;
  23.           if(!pri[n]) {cout<<"提示:该数为素数."<<endl<<"因子个数:2/n分别为:1 "<<n<<endl;continue;}
  24.           tmp=n;
  25.           for(i=l=0;i<p.size();i++)
  26.             {
  27.                 if(tmp%p[i]==0)
  28.                     arr[l++][0]=p[i],arr[l-1][1]=0;
  29.                 while(tmp%p[i]==0)
  30.                     tmp/=p[i],arr[l-1][1]++;
  31.                 if(tmp==1) break;
  32.                 if(!pri[tmp]) {arr[l][0]=tmp,arr[l++][1]=1;break;}
  33.             }
  34.          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]);}
  35.          cout<<"因子个数:"<<kind<<endl;cout<<"分别为:1 ";
  36.          for(i=1;i<(1<<fac.size());i++)
  37.          {l=1;for(j=0;j<fac.size();j++)if(i&(1<<j))l*=fac[j];if(l<=n)factor[l]=1;}
  38.          f=factor.begin();
  39.          while(f!=factor.end())
  40.             {
  41.                 cout<<f->first;
  42.                 f++;
  43.                 if(f!=factor.end()) cout<<' ';
  44.                 else cout<<endl;
  45.             }
  46.         }
  47. }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值