(构造) 1080 两个数的平方和
Posted Ekalos
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(构造) 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 }
以上是关于(构造) 1080 两个数的平方和的主要内容,如果未能解决你的问题,请参考以下文章