(构造)51NOD 1080 两个数的平方和
输入
一个数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 两个数的平方和的更多相关文章
- 51Nod 1080 两个数的平方和(数论,经典题)
1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果 ...
- 51nod 1080 两个数的平方和
没心情写数学题啦啊 好难啊 #include<bits/stdc++.h> using namespace std; set<int> s; set<int>: ...
- 51nod 1080:两个数的平方和
1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果 ...
- 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 ...
- 笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树
出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{…i…j…k…m… ...
- 51Nod 1684 子集价值 (平方和去括号技巧)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是 ...
- Leetcode_001_TwoSum_求和为固定数的两个数的索引
题目描述 给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个).例如,输入:N={1,4,8,20}, target=1 ...
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
一个简单的小算法来获取两个数的最大公约数, public class Test { public static void main(String[] args) { long result = gcd ...
随机推荐
- spring 事件模式 源代码导读
一,jdk 事件对象基类 package java.util; import java.io.Serializable; public class EventObject implements Ser ...
- wyh2000 and pupil
wyh2000 and pupil Accepts: 93 Submissions: 925 Time Limit: 3000/1500 MS (Java/Others) Memory Lim ...
- Objective-C之成魔之路【10-继承性】
郝萌主倾心贡献.尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 继承性是面 ...
- 软件版本号(BETA、RC、ALPHA、Release、GA等)
Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本,alpha 就是α,beta 就是β , ...
- linux 输入子系统(3) button platform driver
button platform driver 一般位于driver/input/keyboard/gpio_keys.c /*用于按键事件的上报,它将在按键的中断发生后被调用.其中逻辑就是获取到按键类 ...
- 【配置关系】—Entity Framework实例详解
实体间的关系,简单来说无非就是一对一.一对多.多对多,根据方向性来说又分为双向和单向.Code First在实体关系上有以下约定: 1. 两个实体,如果一个实体包含一个引用属性,另一个实体包含一个集合 ...
- WPF新手之如何将数据绑定到TreeView
看过许多例子,全是绑定到类的,没人说如何绑定到某个对象,偏偏我这个绝对的新手就是要绑定到一个对象,只能自己摸索了: 首先要将数据绑定到容器,有以下几个默认条件:①元数据必须包装在List或者Obser ...
- 20170225-第一件事:SAP模块清单
第一件事:SAP模块清单 AM 资产会计 资产会计BC SAP Netweaver SAP NetweaverBW 业务信息仓库 业务信息仓库CA 常规跨应用程序 常规跨越应用程序CO 控制 控制 C ...
- js 中整理(一)
一. 冒泡与冒泡阻止 var arr={5,0,-56,900,12,9000,-123}; var flag=false; //大的排序次数(arr.length-1) for(var i=0; ...
- js实现域名判断后跳转到指定网址
js实现域名判断后跳转到指定网址,也适用于同一虚拟空间放多个网站: <script> try { if(self.locatio ...