POJ1001Precision power

转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1305298222

浮点大数求幂,水题一道,把“大数乘浮点数”按指数循环就OK了,注意结果的整数部分若为0,则不保留整数部分。小数部分若为0,则不保留小数部分和小数点。

 

  1 //Memory Time 
2 //1232K 0MS
3
4 #include<iostream>
5 #include<string>
6 using namespace std;
7
8 const int size=1000; //大数位数
9
10 void mult(char* A,char* B,char* ans)
11 {
12 int i,j,k;
13
14 int fract; //总小数个数
15 int dot=-1; //小数点位置
16 for(k=0;A[k]!='\0';k++)
17 if(A[k]=='.')
18 dot=k;
19 int lena=k;
20 if(dot==-1)
21 fract=0;
22 else
23 fract=lena-dot-1;
24
25 dot=-1;
26 for(k=0;B[k]!='\0';k++)
27 if(B[k]=='.')
28 dot=k;
29 int lenb=k;
30 if(dot==-1)
31 fract+=0;
32 else
33 fract+=(lenb-dot-1); //总小数个数
34
35 int a[size+1]={0};
36 int b[size+1]={0};
37 int pa=0,pb=0;
38
39 /*倒序*/
40
41 for(i=lena-1;i>=0;i--)
42 {
43 if(A[i]=='.')
44 continue;
45 a[pa++]=A[i]-'0';
46 }
47 for(j=lenb-1;j>=0;j--)
48 {
49 if(B[j]=='.') //暂时删除小数点
50 continue;
51 b[pb++]=B[j]-'0';
52 }
53
54 int c[2*size+1]={0};
55 int lenc;
56 for(pb=0;pb<lenb;pb++)
57 {
58 int w=0; //低位到高位的进位
59 for(pa=0;pa<=lena;pa++) // = 为了处理最后的进位
60 {
61 int temp=a[pa]*b[pb]+w;
62 w=temp/10;
63 temp=(c[pa+pb]+=temp%10);
64 c[lenc=pa+pb]=temp%10;
65 w+=temp/10;
66 }
67 }
68
69 /*倒序,得到没有小数点的ans*/
70
71 for(pa=0,pb=lenc;pb>=0;pb--)
72 ans[pa++]=c[pb]+'0';
73 ans[pa]='\0';
74 lena=pa;
75
76 /*插入小数点*/
77
78 bool flag=true; //标记是否需要删除小数末尾的0
79 if(fract==0) //小数位数为0,无需插入小数点
80 flag=false;
81 else if(fract<lena) //小数位数小于ans长度,在ans内部插入小数点
82 {
83 ans[lena+1]='\0';
84 for(i=0,pa=lena;pa>0;pa--,i++)
85 {
86 if(i==fract)
87 {
88 ans[pa]='.';
89 break;
90 }
91 else
92 ans[pa]=ans[pa-1];
93 }
94
95 }
96 else //小数位数大于等于ans长度,在ans前面恰当位置插入小数点
97 {
98 char temp[size+1];
99 strcpy(temp,ans);
100 ans[0]='0';
101 ans[1]='.';
102 for(int i=0;i<fract-lena;i++) //补充0
103 ans[i+2]='0';
104 for(j=i,pa=0;pa<lena;pa++)
105 ans[j++]=temp[pa];
106 ans[j]='\0';
107 }
108
109 /*删除ans小数末尾的0*/
110
111 if(flag)
112 {
113 lena=strlen(ans);
114 pa=lena-1;
115 while(ans[pa]=='0')
116 ans[pa--]='\0';
117 if(ans[pa]=='.') //小数全为0
118 ans[pa--]='\0';
119 }
120
121 /*删除ans整数开头的0,但至少保留1个0*/
122
123 pa=0;
124 while(ans[pa]=='0') //寻找ans开头第一个不为0的位置
125 pa++;
126
127 if(ans[pa]=='\0') //没有小数
128 {
129 ans[0]='0';
130 ans[1]='\0';
131 }
132 else //有小数
133 {
134 for(i=0;ans[pa]!='\0';i++,pa++)
135 ans[i]=ans[pa];
136 ans[i]='\0';
137 }
138 return;
139 }
140
141 char a[size+1];
142 char ans[size*size+1];
143
144 int main(void)
145 {
146 int b;
147 while(cin>>a>>b)
148 {
149 memset(ans,'\0',sizeof(ans));
150 ans[0]='1';
151 ans[3]='\0';
152
153 for(int i=1;i<=b;i++)
154 mult(a,ans,ans);
155
156 cout<<ans<<endl;
157 }
158 return 0;
159 }
原文地址:https://www.cnblogs.com/lyy289065406/p/2121403.html