您的位置:首页 > 其它

黄金连分数【大数】

2015-04-10 16:00 120 查看
黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。

对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!

言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。

比较简单的一种是用连分数:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: