zoukankan      html  css  js  c++  java
  • 黄金连分数【大数】

    黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。

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


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

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

    这个连分数计算的“层数”越多,它的值越接近黄金分割数。

    请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。

    小数点后3位的值为:0.618
    小数点后4位的值为:0.6180
    小数点后5位的值为:0.61803
    小数点后7位的值为:0.6180340
    (注意尾部的0,不能忽略)

    你的任务是:写出精确到小数点后100位精度的黄金分割值。

    注意:尾数的四舍五入! 尾数是0也要保留!

    黄金分割书  = F[i] / F[i + 1]

    模拟大数加法和除法就行了

    代码:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cmath>
      5 using namespace std;
      6 
      7 const int maxn = 1005;
      8 int f[maxn][505];
      9 
     10 void init() {
     11     f[1][0] = f[2][0] = 1;
     12     for(int i = 3; i <= 1000; i++) {
     13         for(int j = 0; j <= 500; j++) {
     14             f[i][j] = f[i - 1][j] + f[i - 2][j];
     15         }
     16         for(int j = 0; j <= 500; j++) {
     17             if(f[i][j] >= 10) {
     18                 f[i][j + 1] += f[i][j] / 10;
     19                 f[i][j] %= 10;
     20             }
     21         }
     22     }
     23 }
     24 int cnt;
     25 int a[maxn], b[maxn];
     26 int l1, l2;
     27 
     28 bool S(int x) {
     29     int c[maxn] = { 0 };
     30     for(int i = 1; i <= x; i++) {
     31         c[i] = a[i];
     32     }
     33 //    for(int i = 0; i <= x; i++) {
     34 //        printf("%d", c[i]);
     35 //    } puts("**");
     36     for(int i = x, j = l2; j >= 1; i--, j--) {
     37         c[i] -= b[j];
     38     }
     39     for(int i = x; i >= 1; i--) {
     40         if(c[i] < 0) {
     41             c[i - 1]--;
     42             c[i] += 10;
     43         }
     44     }
     45 //    for(int i = 1; i <= x; i++) {
     46 //        printf("%d", c[i]);
     47 //    } puts("##");
     48 
     49     if(c[0] < 0) {
     50         return false;
     51     } else {
     52         for(int i = 1; i <= x; i++) {
     53             a[i] = c[i];
     54         }
     55         return true;
     56     }
     57 }
     58 
     59 int ans[maxn];
     60 int main() {
     61     init();
     62     memset(a, 0, sizeof(a));
     63     memset(b, 0, sizeof(b));
     64     l1 = 500, l2 = 500;
     65     for(int j = 500; j >= 0; j--) {
     66         if(f[999][j] != 0) {
     67             l1 = j;
     68             break;
     69         }
     70     }
     71     cnt = 1;
     72     for(int j = l1;j >= 0; j--) {
     73         a[cnt++] = f[999][j];
     74     }
     75     for(int j = 500; j >= 0; j--) {
     76         if(f[1000][j] != 0) {
     77             l2 = j;
     78             break;
     79         }
     80     }
     81     cnt = 1;
     82     for(int j = l2; j >= 0; j--) {
     83         b[cnt++] = f[1000][j];
     84     }
     85     cnt = 0;
     86     l1 = 500;
     87 //    for(int i = 1; i <= 6; i++) {
     88 //        a[i] = i + 1;
     89 //    }
     90 //    for(int i = 1; i <= 3; i++)  {
     91 //        b[i] = i;
     92 //    }
     93 //    l2 = 3; l1 = 6;
     94 //    for(int i = 1; i <= l1; i++) {
     95 //        printf("%d", a[i]);
     96 //    } puts("");
     97 //    for(int i = 1; i <= l2; i++) {
     98 //        printf("%d", b[i]);
     99 //    } puts("");
    100     for(int i = l2; i <= 500; i++) {
    101         int nn = 0;
    102         while(S(i)) {
    103             nn++;
    104         }
    105         ans[cnt++] = nn;
    106     }
    107 //    for(int i = 0; i < cnt; i++) {
    108 //        printf("%d", ans[i]);
    109 //    } puts("");
    110     printf("0.");
    111     for(int i = 1; i <= 100; i++) {
    112         printf("%d", ans[i]);
    113     } puts("");
    114 }
    View Code
  • 相关阅读:
    Beyond_Compare 4.2.3中文版下载及密钥(亲测可用)
    ORA-0131:Insufficient privileges(Oracle授予用户DEBUG权限)
    常见正则表达式
    MySQL导入导出SQL文件(txt文件)
    存储过程(总结)
    怎样优化数据更新、访问量大的数据库(总结)
    索引原理(平衡树数据结构)
    Oracle面试题
    Linux系统没有IP地址
    iwlist/iwconfig/iw命令
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/4414908.html
Copyright © 2011-2022 走看看