题意:五边形数由公式Pn=n(3n−1)/2生成,在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对;此时D的值是多少?

思路:二分找和差


/*************************************************************************
> File Name: euler044.c
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月27日 星期二 10时59分39秒
************************************************************************/ #include <stdio.h>
#include <inttypes.h> #define MAX_N 5000
#define MAX_RANGE 37497500 bool Binary_Serch(int32_t n , int32_t *p) { // 判断n是否在数组num[]中
if (n > MAX_RANGE) return false;
int32_t l = 1 , r = MAX_N - 1 , mid;
while (l < r) {
mid = (l + r) >> 1;
if (p[mid] < n) l = mid + 1;
else r = mid;
}
return p[r] == n;
} int32_t main() {
int32_t p[MAX_N];
for (int32_t i = 1 ; i < MAX_N ; i++) {
p[i] = ( 3 * i * i - i ) / 2;
}
int32_t ans = MAX_RANGE + 10;
bool flag = false;
for (int32_t k = 1 ; k < MAX_N ; k++) { // p[k] > p[j] k 从小到大枚举 j 从大到小枚举
for (int32_t j = k - 1 ; j >= 1 ; j--) {
if (!Binary_Serch(p[k] + p[j] , p)) continue;
if (!Binary_Serch(p[k] - p[j] , p)) continue;
if (ans > p[k] - p[j]) { // 假如 ans已经被 p[k] - p[j] 更新完成那就没必要向下继续枚举j,因为向下枚举j时D肯定不会被更新
ans = p[k] - p[j]; flag = true;
break;
}
}
if (flag) break; // 如果 ans已经被更小的 p[k] - p[j] 更新过一次,那就没有必要继续枚举k了,因为向上继续枚举k并不会让D更小
}
printf("%d\n",ans);
return 0;
}

方法二:

/*************************************************************************
> File Name: test.cpp
> Author:
> Mail:
> Created Time: 2018年02月03日 星期六 08时42分28秒
************************************************************************/ #include <bits/stdc++.h>
using namespace std; typedef long long ll; ll Pentagonal(ll n) {
return n * (n * 3 - 1) / 2;
}
bool isPentagonal(ll n) {
int l = 1, r = n, mid;
while (l <= r) {
mid = (l + r) >> 1;
ll t = Pentagonal(mid);
if (t == n) {
return true;
} else if (t < n) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return false;
} int main() {
ll ans = INT_MAX;
ll n = 1, m, p1, p2;
while (true) {
p1 = Pentagonal(n);
p2 = Pentagonal(n - 1);
if (p1 - p2 > ans) break;
for (int m = n - 1 ; m >= 1 ; --m) {
p2 = Pentagonal(m);
if (p1 - p2 >= ans) break;
if (isPentagonal(p1 + p2) && isPentagonal(p1 - p2)) {
ans = p1 - p2;
}
}
++n;
}
printf("ans is %lld\n", ans);
return 0;
}

Project Euler 44 Sub-string divisibility( 二分 )的更多相关文章

  1. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  2. Python练习题 048:Project Euler 021:10000以内所有亲和数之和

    本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...

  3. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  4. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  5. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  6. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  7. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

  8. 【Project Euler 8】Largest product in a series

    题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...

  9. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

随机推荐

  1. UVa - 11283 - PLAYING BOGGLE

    先上题目 Problem F PLAYING BOGGLE Boggle® is a classic word game played on a 4 by 4 grid of letters. The ...

  2. 大数据学习[16]--使用scroll实现Elasticsearch数据遍历和深度分页[转]

    题目:使用scroll实现Elasticsearch数据遍历和深度分页 作者:星爷 出处: http://lxWei.github.io/posts/%E4%BD%BF%E7%94%A8scroll% ...

  3. Java 集合之Collection 接口和遍历方法

    这几篇是我按网上的教程来实习的. URL: http://www.cnblogs.com/jbelial/archive/2013/03/27/2981395.html 打代码的感觉挻好的.. 注意在 ...

  4. HDU 3002

    无向图最小割. #include <iostream> #include <cstdio> #include <cstring> using namespace s ...

  5. 系统报 “client没有所需的特权” 的解决方法

    今在对服务端代码进行单元測试的时候.突然报出例如以下错误: client没有所需的特权 后经网上查找,相同的问题都是属于对C盘读写的问题.回忆自己的项目也须要对C盘进行创建文件夹和读写文件.故尝试运行 ...

  6. js导出table中的EXCEL总结

    导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...

  7. 【cl】本地安装maven的jar包报错Artifact is already in the local repository

    原因是我直接把jar包放在了仓库里面 解决办法:将jar办放在不是仓库路径位置,在进行install就okle

  8. JavaScript 和Ajax跨域问题

    json格式: { "message":"获取成功", "state":"1", "result": ...

  9. Linux系统的命令源码的获取方法

    我们知道,Linux是开源的,它自带的功能强大的命令也是开源的,也就是说.我们能够获得这些命令的源码并研究它.那到底怎样获得系统的命令的源码呢? 命令的源码是一个软件包为单元的,放在一个软件包的源码中 ...

  10. jcaptcha进阶

    1.改动CaptchaServiceSingleton类.使用带參构造方法来创建DefaultManageableImageCaptchaService对象. watermark/2/text/aHR ...