同样的代码 POJ AC了,HDU WA了。 这题繁琐,技术含量倒是不高,主要用到了一个大数的阶乘。 需要注意的是前导0不足的需要添加,整数的话不需要输出小数点。 学习了string类,earse()函数,删除字符,蛮好用。 #include <stdio.h> #include <string.h> #include <string> #include<iostream> using namespace std; #define maxsize 500 struct hp { int len; int s[maxsize+1]; }; void input(hp &a,string str) { int i; while(str[0]=='0' && str.size()!=1) str.erase(0,1); a.len=(int)str.size(); for(i=1;i<=a.len;++i) a.s[i]=str[a.len-i]-48; for (i=a.len+1;i<=maxsize;++i) a.s[i]=0; } void print( hp &y) { int i; for(i=y.len;i>=1;i--) cout<<y.s[i]; cout<<endl; } hp multiplyh(const hp &a, hp &b) { int i,j,len; hp c; for(i=1;i<=maxsize;i++) c.s[i]=0; for(i=1;i<=a.len;i++) for(j=1;j<=b.len;j++) { c.s[i+j-1]+=a.s[i]*b.s[j]; c.s[i+j]+=c.s[i+j-1]/10; c.s[i+j-1]%=10; } len=a.len+b.len+1; while(len>1&&c.s[len]==0) len--; c.len=len; return c; } int main() { //freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); string str1; hp a,b; int n, point, i, d,j; while(cin>>str1>>n) { for( i=0; i<str1.size() ; i++) if(str1[i] == '.') { point = (str1.size()-1-i)*n; str1.erase(i,1); break; } input(a,str1); input(b,str1); for( i=0; i <=n-2; i++) a = multiplyh(a,b); if(point >= a.len) { cout<<'.'; for(i = 0,j=0; i<point-a.len; i++) cout<<j; print(a); } else { for(i = 1; i <= a.len; i++ ) if(a.s[i] != 0) break; d = i; for(i = a.len; i >=point +1; i--) cout<<a.s[i]; if(d >= point + 1) {cout<<endl;continue;} cout<<'.'; for(;i>=d;i--) cout<<a.s[i]; cout<<endl; } } return 0; }