给出一个整数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)。
 #include <stdio.h>
#include <math.h>
int main()
{
long num, n, a, b, d, x, y, e, r, u;
int flag = ;
scanf_s("%ld", &num);
n = (long)sqrt((long double)num / );
d = num - * n*n;
a = -n;
b = n;
x = y = ;
if (d == )
printf("%ld %ld", n, n);//这一步存在问题,虽然运行效率提高了,但是对于情况的考虑不全面,如:50。后附修改版。
else
{
while (x >= )
{
x = a * (a - * n);
y = b * (b - * n);
u = x + y;
if (u == d)
{
e = n - b;
r = n - a;
e < r ? printf("%ld %ld\n", e, r) : printf("%ld %ld\n", r, e);
flag++;
}
if (u > d)
a++;
else
b--;
if (a > )
break;
}
if (flag == )
printf("No Solution\n");
}
return ;
}

修改:

 #include <stdio.h>
#include <math.h>
int main()
{
long num, n, a, b, d, x, y, e, r, u;
int flag = ;
while(scanf_s("%ld", &num) != EOF)
{
n = (long)sqrt((long double)num / );
d = num - * n * n;
a = -n;
b = n;
x = y = ;
while (x >= )
{
x = a * (a - * n);
y = b * (b - * n);
u = x + y;
if (u == d)
{
e = n - b;
r = n - a;
e < r ? printf("%ld %ld\n", e, r) : printf("%ld %ld\n", r, e);
flag++;
}
if (u > d)
a++;
else
b--;
if (a > )
break;
}
if (flag == )
printf("No Solution\n");
}
return ;
}

(构造)51NOD 1080 两个数的平方和的更多相关文章

  1. 51Nod 1080 两个数的平方和(数论,经典题)

    1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果 ...

  2. 51nod 1080 两个数的平方和

    没心情写数学题啦啊   好难啊 #include<bits/stdc++.h> using namespace std; set<int> s; set<int>: ...

  3. 51nod 1080:两个数的平方和

    1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果 ...

  4. 633. Sum of Square Numbers【Easy】【双指针-是否存在两个数的平方和等于给定目标值】

    Given a non-negative integer c, your task is to decide whether there're two integers a and bsuch tha ...

  5. 笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树

    出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{…i…j…k…m… ...

  6. 51Nod 1684 子集价值 (平方和去括号技巧)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是 ...

  7. Leetcode_001_TwoSum_求和为固定数的两个数的索引

    题目描述    给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个).例如,输入:N={1,4,8,20}, target=1 ...

  8. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  9. Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)

    一个简单的小算法来获取两个数的最大公约数, public class Test { public static void main(String[] args) { long result = gcd ...

随机推荐

  1. C#语法复习2

    第五章 方法 1.方法是一块具有名称的代码 包括:方法体.方法头 局部变量必须被赋值才可以执行下面的操作.实例变量有隐式初始化.有时候,类型推断可以用var关键字,类似于C++当中的auto.用于局部 ...

  2. 常见iOS面试题 之 怎么判断一个类是否遵循某个协议

    答案: 使用方法conformsToProtocol. 调用例子: BOOL isConform = [Student conformsToProtocol:@protocol(UIScrollVie ...

  3. Android 特别大的Activity和Fragment的生命周期图

    这么 这么大的图.不做太多解释,哈哈,真的是棒棒的. 代码測试下载:http://download.csdn.net/detail/pcaxb/8906085

  4. VirtualBox 虚拟Ubuntu系统与主机互ping

    互ping的前提是主机和虚拟机的ip地址在同一波段[eg:主机为:192.168.1.10虚拟Linux:192.168.1.11] 1.设置主机ip:                         ...

  5. Ubuntu 16.04 LTS 配置 Jupyter notebook 为服务器

    原材料: Ubuntu 16.04 LTS 64bit 已经配置好 IPython 和 Jupyter (安装步骤可以参照:http://www.cnblogs.com/McKean/p/619497 ...

  6. 阿里云安装nginx 启动失败的原因。

    阿里云编译安装nginx服务器后启动一直报下面错误. 百度了一圈,看到一个说要先关掉apache服务,感觉这个好像是对的,立马做了下面操作. 果然把nginx起了起来. 从这边才知道apache和ng ...

  7. 2016/06/09 ThinkPHP3.2.3使用分页

    效果图:

  8. unity 3D Mesh网络模型,怎样将Constructer拖入场景??

    下图中的将Constructer拖入场景,怎么拖入,不知道... 1.Constructer是一个什么东西?在 下图中没有看到这个名字的,于是乎,我就不知道该怎么办了...

  9. 安卓开发中使用ZXing生成解析二维码

    编码示例 package com.wolf_pan.qrcodesample; import android.graphics.Bitmap; import android.graphics.Colo ...

  10. 使用JavaScript获取浏览器Chrome版本信息

    Navigator对象包含了有关浏览器的信息 可通过访问其属性appVersion或userAgent来获取浏览器Chrome版本 例如,我所使用的QQ浏览器的appVersion和userAgent ...