博主最近被一個學校的刷題系統搞的崩潰了快,以至於最近博主感覺整個人都不好了,那題目是這樣滴:
求一個整數的因子個數。
要求輸入:
輸入包含若干行,每行包含一個正整數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;
}
這個程序還是有一些問題,比如一些大的數據就會因爲你的素數個數不夠導致運算出錯,博主姿勢有限,實在是修改不了,如果大家有人能夠修改的話,希望大家可以和我交流一下,進行修改。