運用素數表,求整數的因子個數

   博主最近被一個學校的刷題系統搞的崩潰了快,以至於最近博主感覺整個人都不好了,那題目是這樣滴:
                   求一個整數的因子個數。
   要求輸入:
   輸入包含若干行,每行包含一個正整數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;

}
      這個程序還是有一些問題,比如一些大的數據就會因爲你的素數個數不夠導致運算出錯,博主姿勢有限,實在是修改不了,如果大家有人能夠修改的話,希望大家可以和我交流一下,進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章