/*
* 程序的版权和版本声明部分:
* Copyright (c) 2014,郑州大学SIAS国际学院
* 作 者: 王 杰
* 完成日期:2014 年 3 月 30 日
*
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/
#include<stdio.h>
#include<math.h>
int main()
{
int t,n,i,count;
scanf("%d",&t);
while(t--){
count=0;
scanf("%d",&n);
n++;
//使用sqrt()函数,不然会超时,而且加不加”=“都能通过,但是结果不一样,有兴趣可以自己试试
for(i=2;i<=sqrt(n);i++){
if(n%i==0)
count++;
}
printf("%d\n",count);
}
return 0;
}
运行结果:(这是有等号的结果)
总结:有一点数学技巧,不然的话做起来就很麻烦。 附上思路:
刚开始做的时候就是穷举,本来就知道要超时,猜到肯定要用到数学知识,或者打表的。但也没有什么方法,所以就先写写看,试运行一下看看前几组结果有什么规律没,最后做了40组数据,也没有发现什么规律。后来找到了上面的这种转换,就容易的多了。不过如果不加 sqrt() 函数,还是会超时,并且有没有"="号,结果会不一样,但是同样可以AC! 不得不说........ 可能是南阳理工上面的不太严格吧。
附上穷举法:
#include<stdio.h>
int main()
{
int t,n,i,j,count,sum;
scanf("%d",&t);
while(t--){
count=0;
scanf("%d",&n);
for(j=1;j<=n;j++){
for(i=1;i<=j;i++){
sum=i*j+i+j;
if(sum==n)
count++;
}
}
printf("%d\n",count);
}
return 0;
}