pku 1001 Exponentiation

http://poj.org/problem?id=1001 题目就是 大整数乘法的问题,只不过给的这个数是一个小数,但好在这是一个求幂的,即使有小数,只要把小数的位置标记一下,把原有的字符串转换为整数,等输出时在真确位置输出小数点即可

本来想拿这道题目再练习一下乘法呢,真没想到自己这么的弱,不是忘了这就是忘了那,考虑的一点都不周全,脑子进水了

View Code
  1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 #define N 10000
6 char str[N],sbr[N];
7 char temp[N];
8 int a[N],b[N],c[N];
9 int n;
10 double r;
11 int ca()
12 {
13 int i,j;
14 int len = strlen(str);
15 for(i = len - 1, j = 0;i >= 0; i--, j++)
16 {
17 a[j] = str[i] - '0';
18 b[j] = str[i] - '0';
19 }
20 int len1,len2;
21 len1 = len2 = len;
22 while(n--)
23 {
24 memset(c,0,sizeof(c)); // 清零
25 for(i = 0; i < len1; i++)
26 {
27 for(j = 0; j < len2 ;j++)
28 {
29 c[i + j] += (a[i] * b[j]);
30 if(c[i+j] > 9)
31 {
32 c[i + j + 1] += (c[i + j] / 10); // 处理进位时注意
33 c[i + j] %= 10;
34 }
35 }
36 }
37 if(c[len1 + len2]) len = len1 + len2;
38 else len = len1 + len2 - 1;
39 for(i = 0; i <= len ; i++)
40 {
41 a[i] = c[i];
42 temp[i] = c[i] + '0';
43 }
44 //cout<<temp<<endl;
45 len1 = len + 1;
46 }
47 return len;
48 }
49 void chang()
50 {
51 int i;
52 int len = strlen(sbr);
53 int j = 0;
54 /*for(i = len - 1; i >= 0; i--)
55 {
56 if(sbr[i] - '0') break;
57 }
58 sbr[i+1] = '\0';
59 len = strlen(sbr);
60 //cout<<sbr<<" "<<len<<endl;*/
61 for(i = 0; i < len; i++)
62 {
63 if(sbr[i] != '.') str[j++] = sbr[i];
64 }
65 }
66 int main()
67 {
68 int i;
69 while(cin>>sbr>>n)
70 {
71 n--;
72 memset(a,0,sizeof(a));
73 memset(b,0,sizeof(b));
74 memset(str,0,sizeof(str));
75 memset(c,0,sizeof(c));
76 int flag = 0;
77 if(r == -1 && n == -1) break;
78 int len;
79 len = strlen(sbr);
80 for(i = len-1; i >= 0; i--)
81 {
82 if(sbr[i] == '.') {flag = 1;break;} // 判定是否有小数点
83 }
84 //cout<<i<<" "<<len<<endl;
85 /*if(flag)
86 {
87 for(i = len - 1; i >= 0; i--)
88 {
89 if(sbr[i] - '0') break;
90 }
91 sbr[i + 1] = '\0';
92 len = strlen(sbr);*/
93 int tmp = 0;
94 if(i == -1) // 如果没有则直接计算即可
95 {
96 strcpy(str,sbr);
97 }
98 else
99 {
100 for(i = len - 1; i >= 0; i--) // 如果有小数点要注意把给定的数后面的零去除掉
101 {
102 if(sbr[i] - '0') break;
103 }
104 sbr[i + 1] = '\0';
105 len = strlen(sbr);
106 for(i = len - 1; i >= 0; i--)
107 {
108 if(sbr[i] == '.') break;
109 }
110 tmp = (n + 1) * (len - i - 1); // 小数点后面应该有多少位
111 chang();
112 }
113 ca();
114 //cout<<tmp<<endl;
115 int tt = strlen(temp);
116 i = N - 1;
117 while(!a[i] ) // 去除前导零,要注意不要处理到小数点后面
118 {
119 if(i == tmp - 1) break;
120 i--;
121 if( i == -1) break;
122 }
123 //cout<<i<<endl;
124 if(i == -1) cout<<"1\n";
125 else
126 for(; i >= 0;i--)
127 {
128 if(i == tmp - 1 && flag) cout<<".";
129 cout<<a[i];
130 }
131 cout<<endl;
132 }
133 return 0;
134 }




原文地址:https://www.cnblogs.com/fxh19911107/p/2410415.html