计算黄金分割数, 精确到小数点后100位
利用裴波那契数列前一项与后一项的比值,且所选取的数越大,精度越高
之后就是大数除法。只是做个简单的,每次上商的时候不断用被除数减去除数,直到减成负的,然后在加上除数,用的是恢复余数的方法
代码:
#include<cstdio> #include<cstring> #define ll long long #define MAX 1000 int a[MAX], b[MAX], c[MAX]; int cnt1; int calc() { int res = 0, cnt; while(1) { for(int i = 0; i < MAX-1; ++ i) { if(a[i] >= c[i]) { a[i] -= c[i]; } else { a[i+1]--; a[i] = 10 + a[i] - c[i]; } } a[MAX-1] -= c[MAX-1]; if(a[MAX-1] < 0 ) { break; } res++; } if(a[MAX-1] < 0) { for(int i = 0; i < MAX; ++ i) { a[i] += c[i]; } for(int i = 0; i < MAX; ++ i) { a[i+1] += a[i]/10; a[i] = a[i]%10; } cnt = MAX-1; while(a[cnt] == 0) { cnt--; } for(int i = cnt; i >= 0; -- i) { a[i+1] = a[i]; } a[0] = 0; } return res; } int main() { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); a[0] = 0; b[0] = 1; for(int i = 0; i < 1000; ++ i) { for(int j = 0; j < MAX; ++ j) { c[j] = a[j] + b[j]; } for(int j = 0; j < MAX; ++ j) { c[j + 1] += c[j]/10; c[j] %= 10; a[j] = b[j]; b[j] = c[j]; } } cnt1 = MAX - 1; while(b[cnt1] == 0) { cnt1--; } printf("除数:\n"); for(int i = cnt1; i >= 0; -- i) { printf("%d", c[i]); } printf("\n"); int cnt = MAX - 1; while(a[cnt] == 0) { cnt--; } printf("被除数:\n"); for(int i = cnt; i >= 0; -- i) { printf("%d", a[i]); } printf("\n"); printf("黄金分割数:\n"); for(int i = 0; i < 101; ++ i) { printf("%d", calc()); if(i == 0) { printf("."); } } return 0; } |