Возведение в степень
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001
Пример решения на Pascal:
Код:
const ss = 1e7; maxl = 7; limit = 50; type integer = longint; arr = array[1..limit] of comp; node = object g: arr; l: integer; procedure mult(d: node); end; var a, b: node; f: arr; n, point: integer; procedure node.mult(d: node); var i, j: integer; tmp: comp; begin fillchar(f, sizeof(f), 0); for i := 1 to l do for j := 1 to d.l do f[i + j - 1] := f[i + j - 1] + g[i] * d.g[j]; g := f; l := l + d.l - 1; tmp := 0; for i := 1 to l do begin g[i] := g[i] + tmp; tmp := int(g[i] / ss); g[i] := g[i] - tmp * ss; end; if tmp > 0 then begin inc(l); g[l] := tmp; end; end; procedure updata; var tmp: comp; ch: char; i: integer; begin tmp := 0; point := 0; for i := 1 to 6 do begin read(ch); if ch = '.' then point := 6 - i else tmp := tmp * 10 + ord(ch) - ord('0'); end; fillchar(a, sizeof(a), 0); a.l := 1; a.g[1] := tmp; readln(n); end; procedure main; var i: integer; begin b := a; for i := 1 to n - 1 do a.mult(b); end; procedure print; var now, i: integer; s, st: ansistring; begin point := point * n; now := (a.l - 1) * maxl + trunc(ln(a.g[a.l]) / ln(10)) + 1; str(a.g[a.l]:0:0, st); for i := a.l - 1 downto 1 do begin str(a.g[i]:0:0, s); while length(s) < maxl do s := '0' + s; st := st + s; end; while (point > 0) and (now > 0) and (st[now] = '0') do begin point := point - 1; now := now - 1; delete(st, now + 1, 1); end; while now < point do begin st := '0' + st; inc(now); end; for i := 1 to now do begin if now - i + 1 = point then write('.'); write(st[i]); end; writeln; end; begin while not eof do begin updata; main; print; end; end.
Пример решения на С++:
Код:
#include "stdio.h" #include "string.h" #define MAX 200 void power(int *a, int base, int n) { int i, j, set=0; memset(a, 0, sizeof(int)*MAX); for(i=0,j=base; i < MAX; i++,j=j/10) a[i] = j%10; for(i=0; i < n-1; i++) { j=0; for(j=0; j < MAX; j++) { set = a[j]*base + set; a[j] = set%10; set = set/10; } } }int main() { char s[MAX]; int a[MAX]; int n, i, base, len, k; while(scanf("%s%d",&s,&n)==2) { base = 0; len = strlen(s); for(i=0; i < len; i++) { if(s[i]=='.') { k = 6-(i+1); continue; } base = base*10 + s[i]-'0'; } for(i=5; s[i]=='0'; i--,k--) base = base/10; k = k*n; power(a, base, n); for(i=MAX-1; i >= 0; i--) { if(a[i] == 0) continue; else break; } if(k > i) { printf("."); for(i=k-1; i >= 0; i--) printf("%d", a[i]); } else { for(; i >= k; i--) printf("%d", a[i]); if(k!=0) printf("."); for(; i >= 0; i--) printf("%d", a[i]); } printf("\n"); } return 0; }