求大数的约数个数问题

来源:互联网 发布:为什么淘宝提问不显示 编辑:程序博客网 时间:2024/05/22 16:53

在求数字的约数的个数时,往往会用for语句实现1-n之间所有的数进行取余数从而判断是不是余数,若是,则加1,这算法行得通,但在oj平台上提交时必定会超时,因为随着n的增大,for循环语句所用的时间会越来越长。。。。

 

下面的程序是:判断1到根号n之间,n的约数个数,从而来确定1到n之间n的约数个数;

 

 

 

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;


int f(int d)
{int i;
int num=0;
for(i=1;i<sqrt(d);++i)
{
 if(d%i==0)
 num=num+1;}  /*如果sqrt(d)不是整数,则约数个数为2*num,如果sqrt(d)是整数时,约数的个数为2*num+1*/
 num=2*num;

int s=sqrt(d);

 if(d==s*s) num++;
 return num;
}

 
int main( )
{ int n,i;

 while(scanf("%d",&n)!=EOF)
 { int *a=new int[n];
    for(i=0;i<n;++i)
 { scanf("%d",&a[i]);
  
 a[i]=f(a[i]);
 }
 for(i=0;i<n;++i)
  cout<<a[i]<<endl;
 }
return 0;
}