Отримання знань

дистанційна підтримка освіти школярів


 

Возведение в степень
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;
}
 

Попередня Зміст Наступна
В системі: гості - (1); користувачі - (0)