大數冪的題目,原來一直沒有勇氣寫。最近終於過了 ,雖然代碼很醜。
算法:模擬
#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; }
額。。真的有時間 確實可以去寫個完全的大整數模板呀。