运用素数表,求整数的因子个数

   博主最近被一个学校的刷题系统搞的崩溃了快,以至于最近博主感觉整个人都不好了,那题目是这样滴:
                   求一个整数的因子个数。
   要求输入:
   输入包含若干行,每行包含一个正整数N 。当N=0时程序结束。
   要求输出:
   输出数字N 的因子个数。
   大召唤术,召唤代码:
   #include <iostream>
   #include <cstring>
   using namespace std;
   const long int maxsize=10000;
   bool flag[maxsize];
   //布尔型变量统计是不是素数
   long int prime[maxsize];
   //记录所有的素数
   long int rember[maxsize];
   //记录银子的个数
   int main()
   {
   //-------------求素数表-----------------
     memset(flag, true, sizeof(flag));//memset()函数是数组快速填充
     memset(rember, 0, sizeof(rember));
     long int size=-1;
     for(long int i = 2; i <= maxsize / 2; i++)
     {
          if(flag[i])
          {
               for(long int j = i << 1 ; j <= maxsize; j += i)
               {
                    flag[j] = false;
               }
          }
     }
     for(long int i = 2 ; i <= maxsize; i++)
     {
           if(flag[i])
           {
               size++;
               prime[size] = i;
           }
     }
     //-------------求素数表结束----------------
     //-------------求因子个数开始---------------
     long int x;
     long int l,m,n=1;
     while(cin>>x)
     {
         if(x==0)
         {
              break;
         }
         else if(x==1)//1的因子个数只有1
         {
              cout<<"1"<<endl;
         }
         else if(x==2||x==3)//2和3的因子个数只有1和自己本身
         {
              cout<<"2"<<endl;
         }
         else
         {
              for(l=0;l<=size;l++)//要把每一个素数都循环一遍
              {
                   while(x!=1)//x的每整除一遍值都要改变,直到x==1;
                   {
                       if(x%prime[l]==0)//如果能整除,负责记录的数组就要记录下来;
                       {
                            rember[l]++;
                            x=x/prime[l];
                       }
                       else//如果不能整除,那就换下一个素数
                       {
                            break;
                       }
                   }
               }
               for(m=0;m<=size;m++)//运算因子个数
               {
                    if(rember[m]>0)//负责记录出现个数的数值值不为1,那么(+1)就相乘,最后的值就是它的因子个数
                    {
                         rember[m]++;
                         n=n*rember[m];
                    }
               }
               cout<<n<<endl;
               n=1;
               memset(rember, 0, sizeof(rember));
         }
    }
    return 0;

}
      这个程序还是有一些问题,比如一些大的数据就会因为你的素数个数不够导致运算出错,博主姿势有限,实在是修改不了,如果大家有人能够修改的话,希望大家可以和我交流一下,进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值