Project Euler:Problem 57 Square root convergents

来源:互联网 发布:布点算法 编辑:程序博客网 时间:2024/06/06 02:48

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?


找规律,大数加法


#include <iostream>#include <string>using namespace std;string strplus(string a, string b){int lena = a.length();int lenb = b.length();int len;if (lena <= lenb){int gap = lenb - lena;string c;c.resize(gap, '0');a = c + a;len = lenb;}else{int gap = lena - lenb;string c;c.resize(gap, '0');b = c + b;len = lena;}int flag = 0;string ans = "";for (int i = len - 1; i >= 0; i--){int tmp = a[i] + b[i] - '0' - '0' + flag;flag = tmp / 10;tmp = tmp % 10;char p = tmp + '0';ans = p + ans;}if (flag == 1)ans = '1' + ans;return ans;}int main(){string a = "3";string b = "2";int count = 0;for (int i = 2; i <= 1000; i++){string tmp = b;b = strplus(a, b);a = strplus(b, tmp);if (a.length() > b.length())count++;}cout << count << endl;system("pause");return 0;}



0 0
原创粉丝点击