Kaonan,
A função
zera deve zerar apenas a primeira posição do vetor.
O principal motivo para guardar os dígitos dos números começando pelo menos significativo é que esse formato de armazenamento é o mais adequado no caso mais realista em que os vetores de dígitos são alocados dinâmicamente e não têm comprimento fixo. Note que neste EP todo "inteiro grande" usa um vetor de
MAX_DIGITOS+1 ints, mesmo que ele tenha poucos dígitos. Note também que há um limite (
MAX_DIGITOS) sobre o número de dígitos dos inteiros grandes. Essas restrições podem ser removidas fazendo alocação dinâmica dos vetores de dígitos (veremos em classe como se pode fazer isso -- é o nosso próximo assunto em MAC0122), de modo que cada vetor tenha exatamente o comprimento necessário para conter um certo "inteiro grande".
E por que nesse caso é melhor guardar os dígitos começando pelo menos significativo? Porque os dígitos dos números ficam "emparelhados" adequadamente. Isso facilita as coisas. Os algoritmos usuais para as operações de adição, subtração e multiplicação começam trabalhando com os dígitos menos significativos e depois vão avançando em direção aos dígitos mais significativos. Considere a soma de dois números num1 e num2. Suponha que os números têm o mesmo sinal, ou seja, a soma é uma soma mesmo (não é uma subtração). Você começa somando os dígitos menos significativos dos dois números, depois vai para os dígitos seguintes. Como os dígitos são guardados começando pelo menos significativo, fica fácil localizar os dígitos menos significativos! O dígito menos significativo está sempre na posição 1 do vetor! (A posição 0 tem o sinal e o número de dígitos.) Então você soma num1[1] com num2[1], depois soma num1[2] com num2[2] e com o vai-um da soma dos dígitos anteriores, etc. Se os dígitos estivessem guardados na ordem oposta, os você teria que somar num1[numero_de_digitos_de_num1]com num2[numero_de_digitos_de_num2] (repare que os índices seriam diferentes), depois somar com num1[numero_de_digitos_de_num1 - 1]num2[numero_de_digitos_de_num2 - 2] e com o vai-um da soma dos dígitos menos significativos, etc. Os índices diferentes aparecem porque os dígitos menos significativos não estão "emparelhados".
Quando os vetores de dígitos têm comprimento fixo (como é o caso no EP1), você poderia guardar os dígitos começando pelo mais significativo, e mesmo assim deixar os dígitos emparelhados encostando o número no final do vetor. O dígito menos significativo ficaria sempre na posição
MAX_DIGITOS. O problema desse esquema é que ele deixa de funcionar se os vetores de dígitos não tiverem comprimento fixo. E esse caso (vetores de comprimentos variáveis) é o mais realista.
Pelo que eu já disse, deve estar claro que não é verdade que guardar os dígitos começando pelo mais significativo facilita a implementação da operação de soma.
Quanto ao uso de
<string.h>, é permitido sim.