- #include<iostream>
- #include<string>
- #include<string.h>
- using namespace std;
- struct bign{
- int data[1000];
- int length;
- int point;
- bign(){
- memset(data, 0, sizeof(data));
- length = 0;
- point = 0;
- }
- };
- string str;
- int n;
- bign Change(){
- bign a;
- a.point = str.length() - str.find('.') - 1;
- int j = 0;
- for(unsigned int i=0;i<str.length();i++){
- if(str[str.length() - i - 1]!='.'){
- a.data[j] = str[str.length() - i - 1] - '0';
- j++;
- }
- }
- a.length = j;
- return a;
- }
- bign multi(bign a, bign b){
- bign c;
- int carry = 0;
- for(int i=0;i<b.length;i++){
- c.length = i;
- for(int j=0;j<a.length;j++){
- int temp = a.data[j] * b.data[i] + carry + c.data[i+j];
- c.data[c.length++] = temp % 10;
- carry = temp / 10;
- }
- while(carry != 0){
- c.data[c.length++] = carry % 10;
- carry /= 10;
- }
- }
- c.point = a.point + b.point;
- return c;
- }
- bign power(bign a, int n){
- if(n==0){
- bign d;
- d.data[0] = 1;
- d.length = 1;
- return d;
- }
- if(n%2==1){
- return multi(a, power(a, n-1));
- }
- else{
- return multi(power(a, n/2), power(a, n/2));
- }
- }
- void show(bign rs){
- string ans;
- int zero = 0; // 记录尾部 0 的数目
- for(int i=0;i<rs.point;i++){
- if(rs.data[i]!=0){
- break;
- }
- else{
- zero++;
- }
- }
- if(str[0]!='0'){
- for(int i=rs.length-1;i>=zero;i--){
- if(zero==rs.point){
- ans.insert(ans.end(), rs.data[i] + '0');
- }
- else{
- if(i==rs.point){
- ans.insert(ans.end(), rs.data[i] + '0');
- ans.insert(ans.end(), '.');
- }
- else{
- ans.insert(ans.end(), rs.data[i] + '0');
- }
- }
- }
- }
- else{
- ans.insert(ans.end(), '.');
- for(int i=rs.point-1;i>=zero;i--){
- ans.insert(ans.end(), rs.data[i] + '0');
- }
- }
- cout<<ans<<endl;
- }
- int main(){
- while(cin>>str>>n){
- bign bg = Change();
- bign rs = power(bg, n);
- show(rs);
- }
- return 0;
- }
来源: https://www.cnblogs.com/sgatbl/p/9420701.html