参考:http://blog.csdn.net/rually/article/details/8585268
#include<iostream> using namespace std; #define MAX 126 int first[MAX],second[MAX]; void pow(char base[],int n) //base 有效数字 { int k=0; int point=-1;//小数点的位置 int tmp[MAX];//存放临时乘积 //初始化 为0 for(int i=0;i<MAX;i++ ) { first[i]=second[i]=0; } //将输入的底数反过来存入first second for(int i=5;i>=0;i--) { if(base[i]!='.') { first[k]=second[k++]=base[i]-'0'; } else //记录小数点的位置 { point=5-i; // 小数点后面有几位数字 } } point=point*n; //乘方 乘n-1次 first 里面存放的是每次乘方的结果 core for(int i=0;i<n-1;i++) { //每次乘方前需要将存放临时结果的tmp清0 for(int j=0;j<MAX;j++) { tmp[j]=0; } //开始乘方 for(int j=0;j<6*(i+1);j++) /// first[j] 数字地一次有效位数5 平方变成10位15 ,20位。。。。 { for(int k=0;k<6;k++) //second[k] { tmp[j+k]+=first[j]*second[k]; //core 结果逐位的乘原数 j表示错位 } } //进位 for(int k=0;k<5*(i+2); k++) { if(tmp[k]>9) { tmp[k+1]+=(int)(tmp[k]/10); tmp[k]=tmp[k]%10; } //tmp付给first first[k]=tmp[k]; } } //end 乘方 //计算出有效数位的长度 //将数字的前面和后面的小数点去掉 int back=0,front=point ; for(int i=0;i<point;i++) //后面的输出截止点 { if(first[i]!=0) { back=i; break; } } for(int i=5*n-1;i>=point;i--) //前面的输出起点 { if(first[i]!=0) { front=i; break; } } //将计算结果打印出来 for(int ii=front;ii>=back;ii--) { if(ii==point)// 因为是从最右边开始 所以的到ii的时候说明右面还剩ii位数字 { //if(first[ii]!=0) //{ // cout<<first[ii]<<"."; //} //else //{ // cout<<"."; //} if(first[ii]!=0) { cout<<first[ii]; } else { if(ii<front) { cout<<first[ii]; } } cout<<"."; } else { cout<<first[ii]; } } } int main() { //char a[7]="0.4321"; //【6】会错误 最后还需一个“ ” //int n=20; //char a[7] = "99.999"; //int n = 25; char a[7] = "3.2000"; int n = 2; pow(a,n); cin.get(); return 0; }