Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 71191 Accepted: 16721

    本题总的来说并不是很难,但是却很麻烦,我在北大上做题时wrong了n次,最终总算通过了,我不知道大牛们是怎么做的,但是我的做法的确是很麻烦

    思想是:就是将输入的自然数a去掉小数点后,然后进行n次大整数相乘,每次的乘数是输入以后去掉小数点的a,被乘数是前面乘过以后的结果。在结束完n次以后将小数点加到合适的位置,并进行前后的除零。

代码:

 

1 #include<stdio.h>
2 #include<string.h>
3  int main()
4 {
5 int i,j,sum,k,res[500][500],flag=0,b,dox,mark,deadline,t;
6 char result[500],a[65],tran[500];
7 while(scanf("%s",a)!=EOF)
8 {
9 sum=0;k=0;dox=0;mark=0;
10 memset(result,0,sizeof(result));
11 result[0]='1';
12 getchar();
13 scanf("%d",&b);
14 int len1=strlen(a);
15 if(a[0]=='0')
16 {
17 for(i=2;a[i]!='\0';i++)
18 a[i-2]=a[i];
19 len1-=2;
20 dox=len1;
21 a[len1]='\0';
22 }
23 else
24 {
25 for(i=0;a[i]!='\0';i++)
26 {
27 if(a[i]=='.')
28 {
29 mark=1;
30 len1--;
31 continue;
32 }
33 if(mark)
34 {
35 a[i-1]=a[i];
36 dox++;
37 }
38 }
39 a[len1]='\0';
40 }
41 for(t=1;t<=b;t++)
42 {
43 memset(res,0,sizeof(res));
44 int len2=strlen(result);
45 strcpy(tran,result);
46 for(i=0;i<len2;i++)
47 result[i]=tran[len2-1-i];
48 k=0;sum=0;
49 for(i=0;i<len1;i++)
50 for(j=0;j<len2;j++)
51 res[i][j]=(a[i]-'0')*(result[j]-'0');
52 for(i=len1-1;i>=0;i--)
53 {
54 for(j=len2-1;j>=0;j--)
55 sum=sum+res[i+len2-j-1][j];
56 result[k]=sum%10+'0';
57 k=k+1;
58 sum=sum/10;
59 }
60 for(i=len2-2;i>=0;i--)
61 {
62 for(j=0;j<=i;j++)
63 sum=sum+res[i-j][j];
64 result[k]=sum%10+'0';
65 k=k+1;
66 sum=sum/10;
67 }
68 if(sum!=0)
69 {
70 result[k]=sum+'0';k=k+1;
71 }
72 }
73 dox=dox*b;
74 int len=strlen(result);
75 if(dox!=0)
76 {
77 if(dox<=len-1)
78 {
79 for(i=len-1;i>=dox;i--)
80 result[i+1]=result[i];
81 result[dox]='.';
82 len++;
83 }
84 else
85 {
86 result[dox]='.';
87 for(i=dox-1;i>len-1;i--)
88 result[i]='0';
89 }
90 }
91 deadline=0;
92 len=len-1>dox?len-1:dox;
93 for(i=0;i<=len;i++)
94 {
95 if(result[i]!='0')
96 {
97 if(result[i]=='.')
98 deadline=i+1;
99 else
100 deadline=i;
101 break;
102 }
103 }
104 mark=0;
105
106 for(i=len;i>=deadline;i--)
107 if(mark==1 || result[i]!='0')
108 {
109 mark=1;
110 printf("%c",result[i]);
111 }
112 printf("\n");
113 }
114 return 0;
115 }
116

     (注意:)我在之前wrong了几次,主要是少考虑了几种情况,经过某位大牛的指点才能通过,此大牛给出的例子是 :

                    4.000 2  结果应该是16 并非16.

                    10.000 2 结果应该是100 并非是1或者100.