Project Euler:Problem 64 Odd period square roots
2015-07-14 22:35
441 查看
All square roots are periodic when written as continued fractions and can be written in the form:
For example, let us consider √23:
If we continue we would get the following expansion:
The process can be summarised as follows:
It can be seen that the sequence is repeating. For conciseness, we use the notation √23 = [4;(1,3,1,8)], to indicate that the block (1,3,1,8) repeats indefinitely.
The first ten continued fraction representations of (irrational) square roots are:
√2=[1;(2)], period=1
√3=[1;(1,2)], period=2
√5=[2;(4)], period=1
√6=[2;(2,4)], period=2
√7=[2;(1,1,1,4)], period=4
√8=[2;(1,4)], period=2
√10=[3;(6)], period=1
√11=[3;(3,6)], period=2
√12= [3;(2,6)], period=2
√13=[3;(1,1,1,1,6)], period=5
Exactly four continued fractions, for N ≤ 13, have an odd period.
How many continued fractions for N ≤ 10000 have an odd period?
√N = a0 + | 1 | ||
a1 + | 1 | ||
a2 + | 1 | ||
a3 + ... |
√23 = 4 + √23 — 4 = 4 + | 1 | = 4 + | 1 | |
1 √23—4 | 1 + | √23 – 3 7 |
√23 = 4 + | 1 | |||
1 + | 1 | |||
3 + | 1 | |||
1 + | 1 | |||
8 + ... |
a0 = 4, | 1 √23—4 | = | √23+4 7 | = 1 + | √23—3 7 | |
a1 = 1, | 7 √23—3 | = | 7(√23+3) 14 | = 3 + | √23—3 2 | |
a2 = 3, | 2 √23—3 | = | 2(√23+3) 14 | = 1 + | √23—4 7 | |
a3 = 1, | 7 √23—4 | = | 7(√23+4) 7 | = 8 + | √23—4 | |
a4 = 8, | 1 √23—4 | = | √23+4 7 | = 1 + | √23—3 7 | |
a5 = 1, | 7 √23—3 | = | 7(√23+3) 14 | = 3 + | √23—3 2 | |
a6 = 3, | 2 √23—3 | = | 2(√23+3) 14 | = 1 + | √23—4 7 | |
a7 = 1, | 7 √23—4 | = | 7(√23+4) 7 | = 8 + | √23—4 |
The first ten continued fraction representations of (irrational) square roots are:
√2=[1;(2)], period=1
√3=[1;(1,2)], period=2
√5=[2;(4)], period=1
√6=[2;(2,4)], period=2
√7=[2;(1,1,1,4)], period=4
√8=[2;(1,4)], period=2
√10=[3;(6)], period=1
√11=[3;(3,6)], period=2
√12= [3;(2,6)], period=2
√13=[3;(1,1,1,1,6)], period=5
Exactly four continued fractions, for N ≤ 13, have an odd period.
How many continued fractions for N ≤ 10000 have an odd period?
#include <iostream> using namespace std; int getPeriod(int n) { int pd = 0; int m = 0, d = 1; int a0 = int(sqrt(n)); int a = a0; while (a != 2 * a0) { m = a*d - m; d = (n - m*m) / d; a = int((sqrt(n) + m) / d); pd++; } return pd; } int main() { int count = 0; for (int i = 2; i <= 10000; i++) { if (int(sqrt(i))*int(sqrt(i)) == i) continue; if (getPeriod(i) % 2 != 0) count++; //cout << i << " " << getPeriod(i) << endl; } cout << count << endl; system("pause"); return 0; }
相关文章推荐
- 为什么重装win8.1后自动弹出安装360
- 使用gazebo实现turtlebot入门级开发
- 【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制
- java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
- 下拉弹出列表选择项效果
- java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】
- 单点登录(一)使用Cookie+File实现单点登录
- Ps常用快捷键
- 【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制
- WIN10系统32,64位系统自动激活版
- 立方和等式
- 互联网搜索广告介绍(二)
- 菜鸟学习c++—实现简单的冒泡排序和插入排序算法
- 如何提高利用视频学习的学习效率—— Swift
- WordPress详细安全设置
- officetohtml
- 【剑指offer】和为S的连续整数序列
- 哈工大操作系统实验3—进程管理
- 黑马程序员----集合框架工具类,几个新特性
- 硬币存钱