博主最近被一个学校的刷题系统搞的崩溃了快,以至于最近博主感觉整个人都不好了,那题目是这样滴:
求一个整数的因子个数。
要求输入:
输入包含若干行,每行包含一个正整数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;
}
这个程序还是有一些问题,比如一些大的数据就会因为你的素数个数不够导致运算出错,博主姿势有限,实在是修改不了,如果大家有人能够修改的话,希望大家可以和我交流一下,进行修改。