HDOJ1017
题目
代码1
这种方法是通过floor函数。floor(x)返回不大于x的最大整数,可以利用这个函数判断x是否为整数。
#include<stdio.h>
#include<math.h>
int isInteger(int a, int b, int m) //判断计算结果是否为整数
{
double result = (double)(a*a+b*b+m)/(a*b);
//printf("result = %f\n", result);
if(result==floor(result))
{
return 1;
}
return 0;
}
int main()
{
int n, m ,i, j, count, number, t;
scanf("%d", &t);
while(t--)
{
number = 0;
while(~scanf("%d%d",&n, &m)&&!(n==0&&m==0))
{
count = 0;
for(i=1;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
{
if(isInteger(i, j, m))
{
count++;
}
}
}
number++;
printf("Case %d: %d\n", number, count);
}
if(t)
{
printf("\n");
}
}
}
代码2
相比方法一更为简单,不需要调用函数,时间上实现了优化。直接判断(ii+jj+m)%(i*j)是否为0,如果为0说明可以整除。
#include<stdio.h>
int main()
{
int n, m ,i, j, count, number, t;
scanf("%d", &t);
while(t--)
{
number = 0;
while(~scanf("%d%d",&n, &m)&&!(n==0&&m==0))
{
count = 0;
for(i=1;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
{
if((i*i+j*j+m)%(i*j)==0)
{
count++;
}
}
}
number++;
printf("Case %d: %d\n", number, count);
}
if(t)
{
printf("\n");
}
}
}
Conclusion
一开始题目的大致意思看懂了,就是在一定范围内枚举,把符合条件的(a,b)对数算出来。然后看到N的时候懵了一下。恩?这个N是干啥的???主要是题目英文太长了,没有耐心看下去。
事实上N的作用体现在题目的这句话里“The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.” 就是说输入N以后,数据分N块(block)输入。每块数据之间有空行。(输入0 0就代表一块数据输入的结束)