ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1012. K-ичные числа. Версия 2

Why Access Violation?
Послано ILTK! 23 июл 2004 11:36
program d1013;
{$APPTYPE CONSOLE}
type
  longnum=array[1..3000] of longint;
function getlen(num:longnum):longint;
var
  i:longint;
begin
  i:=3000;
  while (i>=1) do
    if  (num[i]=0)  then
      dec(i)
    else break;
  getlen:=i;
end;
function sum(num1,num2:longnum):longnum;
var
  h,i,l1,l2,ost:longint;
begin
  l1:=getlen(num1);
  l2:=getlen(num2);
  ost:=0;
  if l1>l2 then
  begin
    for i:=1 to l1 do
    begin
      h:=num1[i];
      num1[i]:=(num1[i]+num2[i]+ost) mod 10;
      ost:=(h+num2[i]+ost) div 10;
    end;
    num1[l1+1]:=num1[l1+1]+ost;
    sum:=num1;
  end
  else
  begin
    for i:=1 to l2 do
    begin
      h:=num2[i];
      num2[i]:=(num2[i]+num1[i]+ost) mod 10;
      ost:=(h+num1[i]+ost) div 10;
    end;
    num2[l2+1]:=num2[l2+1]+ost;
    sum:=num2;
  end;
end;
function mul(k:longint; num:longnum):longnum;
var
  h,ost,l1,i:longint;
begin
  l1:=getlen(num);
  ost:=0;
  for i:=1 to l1 do
  begin
    h:=num[i];
    num[i]:=(num[i]*k+ost) mod 10;
    ost:=(h*k+ost) div 10;
  end;
  num[l1+1]:=ost;
  mul:=num;
end;
var
  n,k,i:longint;
  work1,work2,work3,work:longnum;
begin
  readln(n,k);
  if (n<2) or (k<2) then
    halt;
  if k>10 then
  begin
    i:=n;
    n:=k;
    k:=i;
  end;
 { if k=1 then
  begin
    write(0);
  end;}
  fillchar(work1,sizeof(work1),0);
  fillchar(work2,sizeof(work2),0);
  fillchar(work3,sizeof(work3),0);
  work1[1]:=k mod 10;
  work1[2]:=k div 10;
  work2[1]:=((k-1)*(k+1))mod 10;
  work2[2]:=((k-1)*(k+1))div 10;
  for i:=3 to n-1 do
  begin
    work3:=mul((k-1),sum(work1,work2));
    work1:=work2;
    work2:=work3;
  end;
  fillchar(work,sizeof(work),0);
  if n>3 then
  begin
    work:=mul(k-1,work3);
  end
  else
    if n=3 then
      work:=mul(k-1,work2)
    else
      work:=mul(k-1,work1);
  k:=getlen(work);
  for i:= k downto 1 do
    write(work[i]);
end.
Re: Why Access Violation?
Послано Kraev Aleksey 24 июл 2004 17:54
Thank you for help. I understand my mistake.