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

poj1001

2014年01月23日 ⁄ 综合 ⁄ 共 1255字 ⁄ 字号 评论关闭

连接:http://poj.org/problem?id=1001

大数乘法,一次就过了,目测跟去年相比做水题的能力真是提高不少

方法比较笨,就是首先转化成整数处理,再处理小数点,细心一点就好了

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[200], b[200], c[200];
int n_len, len1;
int cal(int a1[200], int len1) {
   memset(c, 0, sizeof(c));
   for(int i = 0; i < n_len; ++ i) {
      for(int j = 0; j < len1; ++ j) {
         c[i+j] += b[i]*a[j];
      }
   }
   for(int i = 0; i < n_len + len1 - 1; ++ i) {
      c[i + 1] += c[i]/10;
      c[i] %= 10;
      a[i] = c[i];
   }
   for(int i = n_len + len1 - 1; ; ++ i) {
      if(c[i] != 0) {
         a[i] = c[i];
      } else {
         return i;
      }
   }
   return 0;
}
int main(){
   freopen("poj1001.txt", "r", stdin);
   string str;
   int n;
   while(cin>>str>>n) {
      memset(a, 0, sizeof(a));
      memset(b, 0, sizeof(b));
      memset(c, 0, sizeof(c));
      int pos = -1, cnt = 0;
      for(int i = str.length() - 1; i >= 0; -- i) {
         if(str[i] == '.') {
            pos = str.length() - 1 - i;
         }else{
            b[cnt] = a[cnt] = str[i] - '0';
            cnt++;
         }
      }
      len1 = n_len = cnt;
      if(pos < 0) {
         pos = 0;
      }
      for(int i = 1; i < n; ++ i) {
         len1 = cal(a, len1);
      }
      while(len1 >= 0 && a[len1] == 0) {
         len1--;
      }
      if(len1 < 0) {
         printf("0\n");
      } else {
         pos = pos*n;
         if(pos == 0) {
            for(int i = len1; i >= 0; -- i) {
               printf("%d", a[i]);
            }
            printf("\n");
         } else {
            int count = 0;
            string result;
            if(len1 < pos) {
               printf(".");
               while(pos - 1 - len1 > 0) {
                  printf("0");
                  pos--;
               }
               for(int i = len1; i >= 0; -- i) {
                  printf("%d", a[i]);
               }
               printf("\n");
            } else {
               int min = 0;
               while(min < pos && a[min] == 0) {
                  min++;
               }
               for(int i = len1; i >= pos; -- i) {
                  printf("%d", a[i]);
               }
               if(min < pos) {
                  printf(".");
                  for(int i = pos - 1; i >= min; -- i) {
                     printf("%d", a[i]);
                  }
               }
               printf("\n");
            }
         }
      }
   }
   return 0;
}

抱歉!评论已关闭.