PKU的1001题,改进了一下,不限制乘数的位数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100000

int main() {
  char *s;
  int i, j, k, i1, j1, n, q, t, dot, site1, site2, tmp, dotsite, forward, end, st, le;
  int b[LEN], c[LEN], a[10];

  s = (char *)malloc(10);

  while(scanf("%s%d", s, &t) !=EOF) {
    
    if(t == 0) {
      printf("1\n");
      continue;
    }
    n = le = strlen(s);
   
    q = 0;
    for(i = 0; i < le; i++) {
      if(s[i] != '0') {
        q = 1;
        break;
      }
    }
    if(!q) {
      printf("0\n");
      continue;
    }

    dot = le;   //小数点位置
    for(i = 0; i < le; i++) {
      if(s[i] == '.') {
        n = le - 1;
        dot = i;
        break;
      }
    }
       
    for(i = 0, j = le - 1; j >= 0; i++, j--) {
   
      if(s[j] == '.') {
         j--;
      }

      c[i] = a[i] = b[i] = (int)(s[j] - '0');
    }
   
    site1 = site2 = n;
 
    for(i1 = 0; i1 < t - 1; i1++) {
      memset(c, 0, LEN);
      for(i = 0; i < n; i++) {
        k = 0;

        forward = 1;
        for(j = 0; j < i; j++) {
          forward *= 10;
        }
     
        tmp = 0;
        for(j = 0; j < site1; j++) {
          tmp += (a[i] * b[j] * forward + c[k]);
          c[k] = tmp % 10;
          tmp /= 10;
          k++;
        }
     
        k = site1;
        while(tmp) {
          tmp += c[k];
          c[k] = tmp % 10;
          tmp /= 10;
          k++;
        }
        //此判断条件防止乘数首位为零
        if(site2 < k) {
          site2 = k;
        }
     
        if(site2 < (n - dot) * (i1 + 2)) {
          site2 = (n - dot) * (i1 + 2);
        }
      }

      for(i = 0; i < site2; i++) {
        b[i] = c[i];
      }
      site1 = site2;
    }

    dotsite = n - dot;
    dotsite *= t;

    end = 0;
    for(i = 0; i <= dotsite - 1; i++) {
      if(c[i] == 0) {
        end++;
      }
      else {
        break;
      }
    }
   
    st = site2 -1;
    for( i = site2 - 1; i >= dotsite; i--) {
   
      if(c[i] != 0) {
        break;
      }
      st--;
     
    }
   
    j1 = 0;
    for(; i >= dotsite; i--) {
      printf("%d", c[i]);
      j1 = 1;
    }
    if(dotsite && (end != dotsite)) {
      printf(".");
    }

    if(dotsite && (end == dotsite) && !j1) {
      printf("0");
    }

    for(i = dotsite - 1; i >= end; i--) {
      printf("%d", c[i]);
    }
    printf("\n");
  }
  free(s);
}