HDU 七夕节(求一个数的因子和)

七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.

你想知道你的另一半吗?


Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
 
Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.

int f(int a){
	int sum=1;
	for(int i=2;i

这是一开始的想法,超过一半之后就不可能成为因子。但是WA了,因为有成对的因子在一半以内,造成重复计算。比如20的因子:1,2,4,5,10;按照这种做法,4,5会计算两次。

int a[500000];
int f1(){
	memset(a,1,sizeof(a));
	for(int i=2;i<=250000;i++){
		for(int j=i+i;j<=500000;j+i)
			a[j]+=j;
	}
	return 0;
}

这是第二次尝试,答案正确,但是超时了,数组开的太大,有太多冗余计算。

int main()
{
 int i,j,n,a;
 while(cin>>n)
 {
  for(i=0;i>a;
   int sum=1;
   int k=int (sqrt(double (a))); //缩小了时间复杂度,
   for(j=2;j<=k;j++)   //2--sqrt(a)
   {
    int t;
    if(a%j==0)
    {
     sum+=j;
     t=a/j;
     if(t!=j)sum+=t;  //另一半不等,则相加
    }
   }
   cout<

这是参考网上博客后的答案,为什么是sqrt(n)呢?

参考地址:http://blog.sina.com.cn/s/blog_71ded6bf0100skxf.html









你可能感兴趣的:(算法)