PKU 1001 Exponentiation
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001
求高精度冪的題目,題目的難度在于處理如同 .00010 的輸入
寫了好久代碼,但是同學用JAVA只需要一會就能搞定了,郁悶...
附上AC代碼:
1
Source Code
2
3
Problem: 1001 User: hongtaozhy
4
Memory: 304K Time: 0MS
5
Language: G++ Result: Accepted
6
7
Source Code
8
#include<stdio.h>
9
#include<string.h>
10
#include<math.h>
11
void reverse(char*str);
12
void multi(char*num1,char*num2,char*result);
13
char a[100];
14
char str[100];
15
char sum[200];
16
char tem[200];
17
char tem2[100];
18
int main()
{
19
int flag;
20
int n;
21
int key;
22
int flag2;
23
int kk;
24
//freopen("a.txt","r",stdin);
25
//freopen("a2.txt","w",stdout);
26
while(scanf("%s%d",a,&n)==2)
{
27
memset(str,0,sizeof(str));
28
kk=0;
29
flag=-1;
30
flag2=6;
31
int g=0;
32
int j=0;
33
int t = 0;
34
if(a[0]=='.')
{ g=1;}
35
for(int i = 0 ; i < 6 ; i++)
{
36
if(a[i]=='0'&&kk==0)continue;
37
kk=1;
38
a[t++]=a[i];
39
}
40
a[t]='\0';
41
42
if(a[0]=='.')
{
43
for(int i =strlen(a);i>=0;i--)
44
a[i+1]=a[i];
45
a[0]='0';
46
}
{
47
int i;
48
for(i=0 ; i < strlen(a);i++ )
49
if(a[i]=='.') break;
50
if(i==strlen(a))
{a[i]='.';a[i+1]='0';a[i+2]='\0';}}
51
52
for(int i=0;i<strlen(a);i++)
53
if(a[i]=='.')
{ flag=i;kk=1;}
54
else
{
55
if(a[i]=='0'&&flag!=-1&&flag2==strlen(a)) flag2=i;
56
if(a[i]!='0'&&flag!=-1) flag2=strlen(a);
57
str[j++]=a[i];
58
}
59
60
int ne=strlen(a)-flag-1;
61
for(j = strlen(str)-1 ; j >= 0 ; j-- )
{
62
if(str[j] == '0'&&ne--)
{
63
str[j]='\0';
64
}
65
else break;
66
}
67
flag=flag2-flag-1;
68
//接入結束
69
if(g==1)
70
printf(".");
71
memset(sum,0,sizeof(sum));
72
memset(tem,0,sizeof(tem));
73
memset(tem2,0,sizeof(tem2));
74
key=0;
75
sum[0]='1';
76
sum[1]='\0';
77
for(int i=0; i < n ; i++)
78
{
79
if(key!=1)
{
80
key=1;
81
strcpy(tem2,str);
82
multi(sum,tem2,tem);
83
memset(sum,0,sizeof(sum));
84
memset(tem2,0,sizeof(tem2));
85
}
86
else
{
87
strcpy(tem2,str);
88
key=0;
89
multi(tem,tem2,sum);
90
memset(tem,0,sizeof(tem));
91
memset(tem2,0,sizeof(tem2));
92
}
93
}
94
if(key==1)
{
95
for(int i = 0 ; tem[i] != '\0' ; i++ )
{
96
if( tem[i] == '0' && i == 0 ) continue;
97
if(i==strlen(tem)-(flag*n)&&g!=1) printf(".");
98
printf("%c",tem[i]);
99
}
100
}
101
else
{
102
for(int i = 0 ; sum[i] != '\0' ; i++ )
{
103
if( sum[i] == '0' && i == 0 ) continue;
104
if(i==strlen(sum)-(flag*n)&&g!=1) printf(".");
105
printf("%c",sum[i]);
106
}
107
}
108
printf("\n");
109
}
110
return 0;
111
}
112
void multi(char*num1,char*num2,char*result)
113

{
114
int i,j,len1,len2,len;
115
116
len1=strlen(num1);
117
len2=strlen(num2);
118
reverse(num2);
119
reverse(num1);
120
121
for (i=0;i<len1;i++)
122
num1[i] -= '0';
123
for (i=0;i<len2;i++)
124
num2[i] -= '0';
125
126
for (i=0;i<len2;i++)
127
for (j=0;j<len1;j++)
128
{
129
len=i+j;
130
result[len] += num2[i]*num1[j];
131
result[len+1] += result[len]/10;
132
result[len] %= 10;
133
}
134
len=len1+len2-1;
135
for (i=0;i<len;i++)
136
result[i] += '0';
137
if (result[len]) result[len] += '0';
138
reverse(result);
139
}
140
141
void reverse(char*str)
142

{
143
int i;
144
char c;
145
for (i=0;i<strlen(str)/2;i++)
146
{
147
c=str[i];
148
str[i]=str[strlen(str)-i-1];
149
str[strlen(str)-i-1]=c;
150
}
151
}
152
153
154

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18



19

20

21

22

23

24

25

26



27

28

29

30

31

32

33

34



35



36

37

38

39

40

41

42



43

44

45

46



47

48

49

50



51

52

53



54



55

56

57

58

59

60

61



62



63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78



79



80

81

82

83

84

85

86



87

88

89

90

91

92

93

94



95



96

97

98

99

100

101



102



103

104

105

106

107

108

109

110

111

112

113



114

115

116

117

118

119

120

121

122

123

124

125

126

127

128



129

130

131

132

133

134

135

136

137

138

139

140

141

142



143

144

145

146



147

148

149

150

151

152

153

154
