Eu fiz um programinha que calcula primos em pascal...
ele usa 2 arquivos para armazenar os primos (um binário e outro em TXT)
eu usei 2 arquivos pois o TXT é para mera visualização dos números primos e o binário eu uso para acessá-los
o algoritimo do programa é o seguinte: ele verifica se um numero é primo ou não dividindo por todos os primos menores que a raiz quadrada do número até dar uma divisão exata.
o programa é esse:
Program primos;
USES WINCRT;
function primo(n: longint):boolean; {cria uma função para verifiar se o numero é primo ou não...}
var
ARQ_PRI: file of longint;
count,den: longint;
begin
assign(ARQ_PRI, 'PRIMOS.BI');
reset(ARQ_PRI);
count:=-1;
repeat
count:=count+1; {divide o numero pelos primos já guardados no arquivo}
seek(ARQ_PRI,count);
read(ARQ_PRI,den);
until((count = (filesize(ARQ_PRI)-1))OR((n mod den)= 0)OR(den >= (trunc(sqrt(n))+1)));
if (count = (filesize(ARQ_PRI)-1))then {caso o arquivo de primos acabe}
begin
repeat
den:=den+1; {continua as divisões mas agora de 1 em 1 ao invés de primo em primo}
until (den >= (trunc(sqrt(n))+1))OR((n mod den)= 0);
if (den >= (trunc(sqrt(n))+1)) then primo:=TRUE
else primo:=FALSE
end
else begin
if ((n mod den)= 0)then primo:=FALSE;
if (den >= (trunc(sqrt(n))+1)) then primo:=TRUE;
end;
close(ARQ_PRI);
end;
var
ARQ_PRI : file of longint;
quant,count,num: longint;
PRI_TXT: text;
ans: char;
begin
ans:='S';
repeat
clrscr;
assign(ARQ_PRI, 'PRIMOS.BI');
reset(ARQ_PRI);
assign(PRI_TXT, 'PRIMOS.TXT');
reset(PRI_TXT);
append(PRI_TXT);
writeln('Calculadora de primos.');
writeln('Já foram calculados ',filesize(ARQ_PRI),' Primos!');
writeln('Entre com a quantidade de primos a ser calculada:');
readln(quant);
seek(ARQ_PRI,(filesize(ARQ_PRI)-1));
read(ARQ_PRI,num);
count:=0;
repeat
num:=num+1;
if (primo(num)) then
begin
count:=count+1;
append(PRI_TXT);
writeln(PRI_TXT,num);
seek(ARQ_PRI,filesize(ARQ_PRI));
write(ARQ_PRI,num);
clrscr;
writeln(((count*100)div(quant)),'%');
end;
until count = quant;
close(PRI_TXT);
close(ARQ_PRI);
repeat
writeln('Deseja calcular mais primos?(S/N)');
ans:=READKEY;
if NOT(((ans='N') OR (ans='n')) OR ((ans='S') OR (ans='s'))) then writeln('Opção inválida!');
until (((ans='N') OR (ans='n')) OR ((ans='S') OR (ans='s')));
until ((ans='N') OR (ans='n'));
writeln('Pronto!');
end.
O problema é que esse programa presisa dos 2 arquivos já prontos antes de rodar...
eu queria que ele verificasse se esses arquivos existem e caso contrário criá-los
eu sei que tem a função rewrite mas eu não quero que ele apage o arquivo caso ele já exista...
galera caso eu tenha cometido alguma gafe nesse codigo me falem (eu estou aprendendo ainda) :roll:
PS. vcs sabiam que o numero 108276907 é primo?
- Home
- >
- Fórum
- >
- Profissional
- >
- Programação, Sc...
- >
- como verificar se um arqu...
Vixi meu.. esse teu programa pra achar numeros primos é muito complicado. Eh só ir dividindo o numero ate ele mesmo utilizando MOD (Acha o resto). Cada vez que o resto for 0 vc faz cont:=cont+1 e no final se cont:=2 então o numero é primo porque o numero primo só é divisivel por 1 e ele mesmo.
Olha o codigo:
program primos;
uses crt;
var num,cont,i:longint;
begin
clrscr;
writeln('Qual o numero?');
readln(num);
for i:=1 to num do
begin
if num MOD i=0 then
begin
cont:=cont+1;
end;
end;
if cont=2 then
begin
writeln('Esse numero eh primo.');
end
else
begin
writeln('Esse numero nao eh primo.');
end;
readkey;
end.
Seu programa não faz o que o meu faz...
o seu vc entra com um numero e ele verifica se é primo...
o meu gera primos e guarda-os em um TXT...
sem falar que o seu programa é muito mais ineficiente do que o meu...
aliás vou te dar umas dicas de como melhorar o teu...
1° não precisa dividir até o numero, basta até a raiz dele (use o comando trunc para transformar a raiz em numero inteiro e adicione 1 porque o trunc quebra o número, isso significa que um numero truncado vai ser sempre menor que o original, adicionando 1 vc assegura que é pelo menos maior... ex: ao invés de for i:=1 to num do ponha isso: for i:=1 to (trunc(sqrt(num))+1) do
2° não precisa incrementar de 1 em 1, se vc assegurar que o numero não é divisivel por 2, incremente de 2 em 2 (tomando um numero impar de partida)
Pow... se você colocar esse seu código no Delphi, poderá usar a função "FileExists". Basta criar um programa em "Console Application".
Mas sem usar o "Rewrite" eu não sei. :-/
Falowz...
Hellsing.