黄金连分数【大数】
2015-04-10 16:00
120 查看
黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
View Code
对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
比较简单的一种是用连分数:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 1005; int f[maxn][505]; void init() { f[1][0] = f[2][0] = 1; for(int i = 3; i <= 1000; i++) { for(int j = 0; j <= 500; j++) { f[i][j] = f[i - 1][j] + f[i - 2][j]; } for(int j = 0; j <= 500; j++) { if(f[i][j] >= 10) { f[i][j + 1] += f[i][j] / 10; f[i][j] %= 10; } } } } int cnt; int a[maxn], b[maxn]; int l1, l2; bool S(int x) { int c[maxn] = { 0 }; for(int i = 1; i <= x; i++) { c[i] = a[i]; } // for(int i = 0; i <= x; i++) { // printf("%d", c[i]); // } puts("**"); for(int i = x, j = l2; j >= 1; i--, j--) { c[i] -= b[j]; } for(int i = x; i >= 1; i--) { if(c[i] < 0) { c[i - 1]--; c[i] += 10; } } // for(int i = 1; i <= x; i++) { // printf("%d", c[i]); // } puts("##"); if(c[0] < 0) { return false; } else { for(int i = 1; i <= x; i++) { a[i] = c[i]; } return true; } } int ans[maxn]; int main() { init(); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); l1 = 500, l2 = 500; for(int j = 500; j >= 0; j--) { if(f[999][j] != 0) { l1 = j; break; } } cnt = 1; for(int j = l1;j >= 0; j--) { a[cnt++] = f[999][j]; } for(int j = 500; j >= 0; j--) { if(f[1000][j] != 0) { l2 = j; break; } } cnt = 1; for(int j = l2; j >= 0; j--) { b[cnt++] = f[1000][j]; } cnt = 0; l1 = 500; // for(int i = 1; i <= 6; i++) { // a[i] = i + 1; // } // for(int i = 1; i <= 3; i++) { // b[i] = i; // } // l2 = 3; l1 = 6; // for(int i = 1; i <= l1; i++) { // printf("%d", a[i]); // } puts(""); // for(int i = 1; i <= l2; i++) { // printf("%d", b[i]); // } puts(""); for(int i = l2; i <= 500; i++) { int nn = 0; while(S(i)) { nn++; } ans[cnt++] = nn; } // for(int i = 0; i < cnt; i++) { // printf("%d", ans[i]); // } puts(""); printf("0."); for(int i = 1; i <= 100; i++) { printf("%d", ans[i]); } puts(""); }
View Code
相关文章推荐
- 黄金连分数【大数】
- 黄金连分数【大数】
- 蓝桥杯第四届 黄金连分数(大数 斐波那契数列与黄金分割)
- 黄金连分数
- 黄金连分数
- POJ - 3101 - Astronomy - (JAVA大数,分数的最小公倍数)
- 蓝桥杯--2013--黄金连分数(大数)
- java 蓝桥杯 黄金连分数
- 黄金连分数 -第四届蓝桥杯java B组
- 蓝桥杯--2013--黄金连分数(大数)
- 黄金连分数 - 蓝桥杯
- 黄金连分数 - 蓝桥杯
- 黄金连分数
- 黄金连分数 - 蓝桥杯
- c++大数、分数、模数运算实现模板
- 黄金连分数 - 蓝桥杯(2013年第四届蓝桥杯全国软件大赛预赛第4题)
- 黄金连分数
- 黄金连分数
- 黄金连分数(高精度除法)
- 2013年第四届蓝桥杯 黄金连分数