题目链接

题意 : 就是给你一个数n,让你输出能够满足y^2 = n +x^2这个等式的最小的x值。

思路 : 这个题大一的时候做过,但是不会,后来学长给讲了,然后昨天比赛的时候二师兄看了之后就敲了,我也想了一会儿才想起来,真是惭愧啊。。。。。

其实就是将上边那个式子变一下:(y-x)*(y+x) = n ,然后接下来就去枚举(y-x)的值,因为手算了几组数据,发现当这个值越靠近√n时,x的值越小,其实看这个等式也可以看出来,所以枚举的时候从√n这里开始往下枚举就行,然后再看(y-x)+(y+x) = 2*y ,所以你枚举出这个(y-x)的值再用n除以(y-x)得到一个数,这两个数加起来得是2的倍数。

 1 //4143
 2 #include <iostream>
 3 #include <stdio.h>
 4 #include <string.h>
 5 #include <math.h>
 6 
 7 using namespace std;
 8 
 9 
10 int main()
11 {
12     int  T ,n;
13     scanf("%d",&T) ;
14     while(T--)
15     {
16         scanf("%d",&n) ;
17         int temp = sqrt(n) ,i;
18         for(i = temp ; i >= 1 ; i--)
19         {
20             if(n % i == 0 && n/i != i && (n/i+i) % 2 == 0)
21             {
22                 printf("%d\n",(n/i+i)/2-i) ;
23                 break ;
24             }
25         }
26         if(i == 0) printf("-1\n") ;
27     }
28     return 0;
29 }
View Code

 

posted on 2014-05-06 00:00  枫、  阅读(184)  评论(0编辑  收藏  举报