1. 程式人生 > >(構造) 1080 兩個數的平方和

(構造) 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 }