(构造)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 ...
随机推荐
- 解决最新版的ADT没有NDK选项的问题
最新版的ADT不显示NDK,解决方法有两种,第一种方法在线重装一下 这种方法有一个问题就是,google的东西我们经常不能访问,解决方法可以参考http://blog.csdn.net/shi_wei ...
- C开发人员眼中的SICP学习
谈谈自己看SICP的一些体会 第一章 构造过程抽象 这一章事实上和C语言全然等价, 不打算深入学习LISP的能够高速略过. 思想上没有太多新的东西. 这一章最核心的价值就是以下3句话, 理解了这一章 ...
- c# 扩展方法奇思妙用基础篇五:Dictionary<TKey, TValue> 扩展
Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多 ...
- nodejs 实战
使用 Koa + MongoDB + Redis 搭建论坛系统 「新手向」koa2从起步到填坑 基于koa2和react的PC端脚手架 一键生成koa/koa2项目: nodejs原生,express ...
- 树的深度优先遍历和广度优先遍历的原理和java实现代码
import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...
- Hadoop中序列化与Writable接口
学习笔记,整理自<Hadoop权威指南 第3版> 一.序列化 序列化:序列化是将 内存 中的结构化数据 转化为 能在网络上传输 或 磁盘中进行永久保存的二进制流的过程:反序列化:序列化的逆 ...
- Tomcat启动报:invalid LOC header (bad signature)的问题
原因:这种一般是因为项目依赖的某个jar包损坏引起的, 解决办法: 1.右键项目,选择maven,更新(update maven project) 2.通过右击项目名 -> Run as -& ...
- FZU1686 神龙的难题 —— Dancing Links 可重复覆盖
题目链接:https://vjudge.net/problem/FZU-1686 Problem 1686 神龙的难题 Accept: 812 Submit: 2394 Time Limit: ...
- vi编辑器设置行号可见
vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可
- 构建Docker平台【第一篇】环境准备
主机信息 操作系统版本 CentOS-7-x86_64-Everything-1511 主机A 192.168.6.128 主节点 主机B 192.168.6.129 主节点 主机C 192.16 ...