Написать программу на pascal. условие пусть имеется неотрицательное целое число, представленное в виде массива своих цифр. требуется возвести его в некоторую заданную степень. формат входного файла первая строка входного файла "input.txt" представляет собой десятичную запись длинного целого числа a. следующая строка содержит показатель степени n, в которую необходимо возвести указанное число. формат выходного файла выходной файл "output.txt" должен содержать результат возведения в степень, представленный в десятичной системе счисления. ограничения 0≤a≤10 в 50 степени, 0 примеры тестов входной файл (input.txt) 1) 10203756485819806252197658031528043601970 2 2) 55786 17 выходной файл (output.txt) 1) 104116646421909761950282879573175588809976767764774752111453905887721451787880900 2) 490827381405222212342433355512086149590506305271663102056527621790991920279453696

артbig артbig    1   15.09.2019 05:50    0

Ответы
Snyezha Snyezha  07.10.2020 16:18
PROGRAM Power_Long;

var
    i:byte; // счетчик
    si, so:string; // числа в виде строк
    power:byte; //показатель степени

function readFile(filename:string):string;
var f:text;
    s:string;
begin
  assign(f,filename);  Reset(f);
  readln(f,s);
  readln(f,power);
  close(f);  
  readFile := Trim(s);
end;

function multiplyLong(s1:string; s2:string):string;
var
    i,j,k,l:byte; //счетчики
    z:boolean; //
    A,B,T,R:array [0..100] of byte; //массивы
    carry:byte; //перенос при умножении и суммировании
    rt:string;//результат
begin

  // первая строка чисел в массив
  l:=Length(s1);
//  A := new byte[l+1];
  A[0]:=l; //количество
  for i:=l downto 1 do
    A[l-i+1]:=ord(s1[i]) - 48;

  // вторая строка чисел в массив
  k:=Length(s2);
//  B := new byte[k+1];
  B[0]:=k; //количество
  for i:=k downto 1 do
    B[k-i+1]:=ord(s2[i]) - 48;
    
  i:=l+k; // 999*9999=9989001, т.е. максимум 7знаков
//  R := new byte[i+1]; //массив с результатом
  R[0]:=i;//количество
//  T := new byte[i+1];//temp - произведение A на один знак из B

  for i:=1 to A[0] do begin
    
    //T := умножение A на один знак из B
    carry:=0;
    for j:=1 to B[0] do begin
      k:= A[i] * B[j] + carry;
      carry := k div 10;
      T[j]:= k mod 10;
    end;
    j:=j+1;
    T[j]:=carry;
    T[0]:=j;
    
    // прибавление T к результату R
    carry:=0;
    for j:=1 to T[0] do begin
      k := T[j] + R[j+i-1] + carry;
      carry := k div 10;//перенос
      R[j+i-1] := k mod 10;
    end;
  end;

  rt:='';
  z:=false;//проверка на ведущие нули
  for i:= R[0] downto 1 do begin
    if (R[i]>0) then begin
      rt := rt + R[i];
      z:=true;//все последущие нули надо добавить в число
    end else
      if (R[i]=0) and z then
        rt := rt + R[i];
        
  end;
 
  multiplyLong := rt;
end;

BEGIN
  si := readFile('input.txt');
  so := multiplyLong(si, si); //возвели во вторую степень
 
  // возведение в степень от 3 и выше умножением
  for i:=3 to power do begin
    so := multiplyLong(si, so);
  end;

  writeln( si, '^',power,' = ',so );
END.
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика