(构造)51NOD 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);//这一步存在问题,虽然运行效率提高了,但是对于情况的考虑不全面,如:50。后附修改版。
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 }

 修改:

 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     while(scanf_s("%ld", &num) != EOF)
 8     {
 9         n = (long)sqrt((long double)num / 2);
10         d = num - 2 * n * n;
11         a = -n;
12         b = n;
13         x = y = 0;
14         while (x >= 0)
15         {
16             x = a * (a - 2 * n);
17             y = b * (b - 2 * n);
18             u = x + y;
19             if (u == d)
20             {
21                 e = n - b;
22                 r = n - a;
23                 e < r ? printf("%ld %ld\n", e, r) : printf("%ld %ld\n", r, e);
24                 flag++;
25             }
26             if (u > d)
27                 a++;
28             else
29                 b--;
30             if (a > 0)
31                 break;
32         }
33         if (flag == 0)
34             printf("No Solution\n");
35     }
36     return 0;
37 }

 

转载于:https://www.cnblogs.com/Ekalos-blog/p/10261164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值