(构造) 1080 两个数的平方和

给出一个整数N,将N表示为2个整数i与j的平方之和(i <= j),如果有多种表示,按照i的递增序输出。
例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2(注:3^2 + 11^2同11^2 + 3^2算1种)
 

输入

一个数N(1 <= N <= 10^9)

输出

共K行:每行2个数,i j,表示N = i^2 + j^2(0 <= i <= j)。
如果无法分解为2个数的平方和,则输出No Solution

输入样例

130

输出样例

3 11
7 9
解:简单的做法是打表之后二分查找(也可以不打表)。
  看见别人的更好的方法,是用构造做的,利用
 (n-a)^2+(n-b)^2=2*n^2+a^2+b^2-2*n*a-2*n*b(注意:a<=0)。
 1 #include <stdio.h>
 2 #include <math.h>
 3 int main()
 4 {
 5     long num, n, a, b, d, x, y, e, r, u;
 6     int flag = 0;
 7     scanf_s("%ld", &num);
 8     n = (long)sqrt((long double)num / 2);
 9     d = num - 2 * n*n;
10     a = -n;
11     b = n;
12     x = y = 0;
13     if (d == 0)
14         printf("%ld %ld", n, n);
15     else
16     {
17         while (x >= 0)
18         {
19             x = a * (a - 2 * n);
20             y = b * (b - 2 * n);
21             u = x + y;
22             if (u == d)
23             {
24                 e = n - b;
25                 r = n - a;
26                 e < r ? printf("%ld %ld\n", e, r) : printf("%ld %ld\n", r, e);
27                 flag++;
28             }
29             if (u > d)
30                 a++;
31             else
32                 b--;
33             if (a > 0)
34                 break;
35         }
36         if (flag == 0)
37             printf("No Solution\n");
38     }
39     return 0;
40 }

猜你喜欢

转载自www.cnblogs.com/Ekalos-blog/p/10261164.html