这道题本来很简单,就是OJ没按要求判断。。。
Problem: 1001 | User: wjinkun | |
Memory: 384K | Time: 0MS | |
Language: GCC | Result: Accepted |
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 unsigned char R[6];
7 int num2[6],num1[151],num3[151]; //num2要取6,可能没有小数点
8 int i,j,k,f,l,n,dot,weishu1,weishu2,temp; //num1*num2=num3 num1的位数为weishu1 .....
9 while(scanf("%s%d",R,&n)==2)
10 {
11 i=5;
12 j=0;
13 memset(num1,0,sizeof(num1));
14 memset(num2,0,sizeof(num2));
15 dot=0; //可能没有小数点
16 while(i>=0)
17 {
18 if(R[i]=='.')
19 dot=5-(i--); //小数点位置
20 else
21 {
22 num2[j]=R[i]-48;
23 num1[j++]=R[i--]-48;
24 }
25 }
26 dot=dot*n;
27 i=5;
28 while(i>=0 && num2[i]==0) //i>=0判断越界!
29 i--;
30 weishu1=weishu2=i+1;
31 for(i=1; i<n; i++) //n次幂
32 {
33 memset(num3,0,sizeof(num3));
34 for(j=0; j<weishu2+weishu1; j++) //乘积后的位数
35 {
36 for(k=0; k<weishu2&&j-k>=0; k++) //从个位开始一位一位求
37 {
38 temp=num1[j-k]*num2[k]+num3[j];
39 num3[j]=temp%10;
40 num3[j+1]+=temp/10;
41 }
42 }
43 j=150;
44 memcpy(num1,num3,sizeof(num1));
45 while(j>=0 && num1[j]==0) //更新num1位数
46 j--;
47 weishu1=j+1;
48 }
49 i=150;
50 while(i>=0 && num1[i]==0) //第一个不为零的数
51 i--;
52 f=i;
53 i=0;
54 while(i<=150 && num1[i]==0) //最后一个不为零的数
55 i++;
56 l=i;
57 if(f==-1) //0.0000
58 printf("%d",0);
59 else if(dot>f) //0.00044这种情况
60 {
61 printf("%c",'.');
62 for(i=dot-1; i>=l; i--)
63 {
64 printf("%d",num1[i]);
65 }
66 }
67 else if(f>=dot && dot>l) //5.5这种情况
68 {
69 for(i=f; i>=dot; i--)
70 {
71 printf("%d",num1[i]);
72 }
73 printf("%c",'.');
74 for(; i>=l; i--)
75 {
76 printf("%d",num1[i]);
77 }
78 }
79 else if(dot<=l) //560这种情况
80 {
81 for(i=f; i>=dot; i--)
82 {
83 printf("%d",num1[i]);
84 }
85 }
86 putchar('\n');
87 }
88 return 0;
89 }
Loading...