[Project Euler] - Problem 57

It is possible to show that the square root of two can be expressed as an infinite continued fraction.

√ 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213...

By expanding this for the first four iterations, we get:

1 + 1/2 = 3/2 = 1.5
1 + 1/(2 + 1/2) = 7/5 = 1.4
1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666...
1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379...

The next three expansions are 99/70, 239/169, and 577/408, but the eighth expansion, 1393/985, is the first example where the number of digits in the numerator exceeds the number of digits in the denominator.

In the first one-thousand expansions, how many fractions contain a numerator with more digits than denominator?

?View Code RSPLUS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
f <- function(i) {
	#x <- 1/2
	x <- c(1,2) ## numerator, denominator
	x <- gmp::as.bigz(x) # to support large sized integer values
	if (i > 1) {
		for (j in 2:i) {
			#x= 1/(2+x)
			x <- rev(c(x[2] * 2 + x[1], x[2]))
		}
	}
	#x <- 1 + x
	x <- c(x[2] + x[1], x[2])
	return(x)
}
 
dec.len <- function(d) {
	l <- length(unlist(strsplit(as.character(d), split="")))
	return(l)
}
 
is.longer <- function(x) {
	# x is a vector of length 2 c(numerator, denomiator)
	num.len <- dec.len(x[1])
	denom.len <- dec.len(x[2])
	if (num.len > denom.len) {
		return(TRUE)
	} else {
		return(FALSE)
	}
}
> idx <- sapply(1:1000, function(x) is.longer(f(x)))
> sum(idx)
[1] 153
p5rn7vb

Related Posts

  1. 应该把中间结果存起来,才算得快 :arrow:

    Reply

  2.  
    dec.len < - function(x) {
    	x <- as.character(x)
    	n <- nchar(x)
    	return(n)
    }
    

    dec.len这样写好点。

    Reply

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>