现在的位置: 首页 > 综合 > 正文

大数除法

2014年02月15日 ⁄ 综合 ⁄ 共 1079字 ⁄ 字号 评论关闭

计算黄金分割数, 精确到小数点后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;
}

抱歉!评论已关闭.