大数幂的题目,原来一直没有勇气写。最近终于过了 ,虽然代码很丑。 算法:模拟 #include <iostream> #include <string> using namespace std; string changeCharToString(char *p) //把char转换为string { string str=""; size_t lenght=strlen(p); for(size_t i=0;i<lenght;i++) str+=p[i]; return str; } string itos(int b) //把int转换为string { int a[15]; int i = 0,j; while(b!=0) { a[i] = b%10; b = b/10; i++; } string c ; int mk = 0; char mm[15]; for(j = i-1; j >=0; j--) { mm[mk++] =a[j]+'0'; } mm[mk] = '/0'; return changeCharToString(mm); } string add(string re,string s) //两个大整数的相加 { int i,j,lre,ls,jin,tmp; lre=re.length(); ls=s.length(); jin=0; if(lre<ls) { string tmp; tmp=re; re=s; s=tmp; } lre=re.length(); ls=s.length(); for(i=lre-1,j=ls-1;j>=0 && i>=0;i--,j--) { tmp=re[i]+s[j]-'0'-'0'+jin; re[i]=tmp%10+'0'; jin=tmp/10; } for(;i>=0;i--) { if(jin==0) break; tmp=re[i]+jin-'0'; re[i]=tmp%10+'0'; jin=tmp/10; } if(jin==1) re='1'+re;//字符串的相加,解决了那个加出来的位数比原来大的情况 return re; } string bigsub(string a, int b) //一个string大整数与一个int型相乘 { string re,strb; int la = a.length(); int i,j=1; int temp; for( i = la -1 ; i>=0 ; i--) { temp = b*(int)(a[i]-'0') *j; strb = itos(temp); re = add(strb,re); j = j*10; } return re; } string superbigsub(string a,string b) //两个大整数string的乘法 { int lb = b.length(); int i,j = 0; string rb; string back; string zeor; for(i = lb - 1; i>=0 ; i--) { int temp = (int)(b[i]-'0'); rb = bigsub(a,temp); rb+= zeor; back = add(rb,back); zeor+="0"; } return back; } string doit(string a,int b) //最终的幂没有优化的 { string mm = a; for(int i = 1 ; i< b; i++) { mm = superbigsub(a,mm); } return mm; } string noling(string a) { int i = 0; string bs; while(a[i] == '0') i++; bs = a; int j = 0; while(a[i] != '/0') { bs[j++] = a[i++]; } bs[j] = '/0'; return bs; } int main() { /* string a; int b; string bs; int i,j; int yidian; while(cin>>a>>b) { int fid = a.find(".",0); if(fid == 1) { yidian = 4; a.erase(fid,fid); cout<<a<<endl; a = noling(a); } else if(fid != -1) { int la = a.length(); cout<<fid<<endl; yidian = a.length() -fid; while(fid != la -1) { a[fid] = a[fid+1]; fid++; } a[fid] = '/0'; cout<<a<<endl; } string outstr; string mm = doit(a,b); cout<<mm<<endl; }*/ double a; int b; int i,j; while(cin>>a>>b) { //cout<<"a: "<<a<<endl; if(a*1.0/((int)a)==1) //当输入的树为整数的时候的操作 { cout<<doit(itos(a),b)<<endl; continue; } int aa = a*10000; int tuiwei = 4*b; string m = itos(aa); string mm = doit(m,b); if(a >= 1) //当输入的数如:1.2648 比0大的数 { for( i = 0 ; i < mm.length() - tuiwei ; i++) cout<<mm[i]; char b[100]; j = 0; for( ;mm[i]!='/0'; i++) { b[j++] =mm[i]; } b[j] = '/0'; j =strlen(b)- 1; while(b[j] == '0') j--; b[++j] = '/0'; cout<<"."; printf("%s/n",b); } else { cout<<"."; for(i = 0 ; i < tuiwei - mm.length() ; i++) cout<<"0"; i = mm.length() - 1; while( mm[i]== '0' ) i--; for(j = 0 ; j <= i ; j++) cout<<mm[j]; cout<<endl; } } return 0; } 额。。真的有时间 确实可以去写个完全的大整数模板呀。