symons

___________每一天都是幸福的!!

  博客园  ::  :: 新随笔  ::  :: 订阅 订阅  :: 管理

这题真是超级大模拟。好繁琐,自己写的打数加法,乘法,写的比我大一时候写的要好很多,大一是借助C++里面的string来写的,这把只用了C,浇一次就ac了,挺开心的,不过写了2个小时啊。注意零的处理。大体思路就是先找出有多少位小数,要提前处理掉后面补充位置的零,然后把这个数转换成整数,做n次方,然后输出时候再查一下点的位置输出就好了。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #define  mmax(a,b) (a)>(b):(a):(b)
  4 void bigadd(char a[],char b[],char res[]){
  5     int la=strlen(a),lb=strlen(b);
  6     int i,j,t,sign;
  7     char tmp[100000];
  8     char zero[10000]="0000000000000000000";
  9     if(la<lb){
 10         strcpy(tmp,a);
 11         strcpy(a,b);
 12         strcpy(b,tmp);
 13         la=strlen(a);
 14         lb=strlen(b);
 15     }
 16     for(i=la-1,j=lb-1;i>=0&&j>=0;--i,--j){
 17         a[i]=a[i]+b[j]-'0';
 18     }
 19     strcpy(zero+1,a);
 20     strcpy(a,zero);
 21     for(i=strlen(a)-1;i>0;--i){
 22         a[i-1]+=(a[i]-'0')/10;
 23         a[i]=(a[i]-'0')%10+'0';
 24     }
 25     for(i=0;i<strlen(a);++i){
 26         if(a[i]!='0') break;
 27     }
 28     if(i==strlen(a)) strcpy(res,"0");
 29     else strcpy(res,a+i);
 30     return ;
 31 }
 32 void bigmul_one(char a[],char b,char res[]){
 33     char zero[10000]="000000000000000000000000000000000000000";
 34     strcpy(zero+1,a);
 35     strcpy(a,zero);
 36     int ji[10000];
 37     int i,n=b-'0',l=strlen(a);
 38     for(i=0;i<l;++i){
 39         ji[i]=(a[i]-'0')*n;
 40     }
 41     ji[0]=0;
 42     for(i=l-1;i>0;--i){
 43         ji[i-1]=ji[i]/10+ji[i-1];
 44         ji[i]=ji[i]%10;
 45     }
 46     a[0]='0';
 47     for(i=l-1;i>=0;--i){
 48         a[i]='0'+ji[i];
 49     }
 50     for(i=0;i<l;++i){
 51         if(a[i]!='0') break;
 52     }
 53     if(i==l) strcpy(res,"0");
 54     else strcpy(res,a+i);
 55 }
 56 
 57 
 58 
 59 void bigmul(char a[],char b[],char res[]){
 60     int la,lb=strlen(b);
 61     char r[10000];
 62     char tmp[10000]="00000000000000000000000000";
 63     char zero[20000]="0";
 64     char t1[10000],t2[1000000];
 65     char aaa[10000];
 66     char haha;
 67     int i,j,t,cnt;
 68     strcpy(res,"0");
 69     for(j=0;j<lb;++j){
 70         haha=b[j];
 71         strcpy(t1,a);
 72         bigmul_one(t1,haha,t2);// t2 = res;
 73         for(i=j+1;i<lb;++i)    strcat(t2,"0");
 74         bigadd(res,t2,aaa);
 75         strcpy(res,aaa);
 76     }
 77 //    printf("res=%s\n",res);
 78 }
 79 int main(){
 80     char a[10000],b[10000],res[10000];
 81     char tt[10000];
 82     int n,i,l;
 83     int cnt;
 84     int success;
 85     while(~scanf("%s%d",a,&n)){
 86         success=0;
 87         strcpy(res,"1");
 88 
 89 
 90         l=strlen(a);
 91 
 92         for(i=l-1;i>=0;--i){
 93             if(a[i]!='0') break;
 94         }
 95         if(i<=0) i=0;
 96         a[i+1]='\0';
 97 
 98         l=strlen(a);
 99 
100 
101 
102         cnt=0;
103         for(i=0;i<l;++i)
104             if(a[i]=='.') break;
105         strcpy(a+i,a+i+1);
106         cnt=l-1-i;
107         if(cnt<0) cnt=0;
108         cnt=cnt*n;
109         for(i=1;i<=n;++i){
110             strcpy(b,a);
111             bigmul(res,b,tt);
112             strcpy(res,tt);
113         }
114         l=strlen(res);
115         if(cnt>=l){
116             printf(".");
117             for(i=0;i<cnt-l;++i) printf("0");
118             printf("%s\n",res);
119 
120         }else{
121             for(i=0;i<l;++i){
122                 printf("%c",res[i]);
123                 if(i+1==l-cnt&&i+1!=l) printf(".");
124             }
125             printf("\n");
126         }
127 
128     }
129     return 0;
130 }

 

 

posted on 2014-01-09 02:42  symons  阅读(229)  评论(0编辑  收藏  举报