Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Problemas com numeros primos


Posts recomendados

Galera eu to começando a aprender pascal e to com um problema aqui em uma questão de um trabalho. Eu precisaria fazer a  conjectura de Goldbach onde 2 números primos somados poderia dar um número par maior que 4, porém meu codigo está fazendo a soma de dois números pares em vez de números primos. Eu sei que tem muitas coisas erradas ai, o problema é que eu não sei onde estão kkk

Program Pzim ;
uses crt;
var 
		num,num1, num3, num4, cont, cont2, cont3, num2, i:Integer; 
Begin
cont:= 0;
cont2:=0;
cont3:=0;
clrscr; 
write('Digite um número par entre [4, 1000]: ');
readln(num);
	if (num < 4 ) then 
	begin 
		writeln('O número digitado deve ser maior que 4! ');
	end
else
	if (num > 1000 ) then 
	begin 
 		writeln('O número digitado deve ser menor que 1000! ');
  end
else
	if ((num mod 2) <> 0 ) then 
	begin 
		writeln('O número digitado deve ser Par! ');
  end;
		for i:=2 to (num div 2) do
		begin
			num1:= i;
			num2:= num - i;
			if (num1 mod 2 <> 0) and (num2 mod 2 <> 0) then
			begin
				 for i:=1 to num1 do                         
				 begin
				 	if (num1 mod i = 0) then
				 	cont:= cont + 1;
				 end;
         	if (cont = 2) then
         	num3:= num1;
         	
				 for i:=1 to num2 do
				 begin
				 	if (num2 mod i = 0) then
				 	cont2:= cont2 + 1;
         	if (cont2 = 2) then
         	num4:= num2;
				 end;
					if (num3 + num4 = num) then
					writeln(num3,'+',num4);
			end;
		end;		               
End.

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, FredonVendrusk disse:

Eu precisaria fazer a conjectura de Goldbach onde 2 números primos somados poderia dar um número par maior que 4

 

@FredonVendrusk, matematicamente toda e qualquer soma de 2 números primos vai dar par, afinal praticamente 100% dos primos são ímpares!!! A única exceção será a soma do 2 com outro primo qualquer (diferente de 2)... Veja: até 2 + 2 dá par!, ou seja: das infinitas possibilidades, apenas pode não dar certo se tiver o 2 envolvido... no resto, sempre será par.

 

Outro ponto é: a conjectura já está feita, não precisa novamente 😅. O problema todo está em demonstrar se a conjectura é verdadeira ou não...

 

 

 

2 horas atrás, FredonVendrusk disse:

porém meu código está fazendo a soma de dois números pares em vez de números primos

 

Testei o código e na verdade ele está somando número ímpares... "apenas" nem sempre são ímpares...

 

 

Mas vamos lá:

 

Sempre mantenha o código bem identado. Só de identar, já aparece um erro:

Program Pzim ;
uses
  CRT;
var 
	num, num1, num2, num3, num4,
	cont, cont2, cont3, i :integer; 

begin
cont:= 0;
cont2:=0;
cont3:=0;
clrscr; 
write('Digite um número par entre [4, 1000]: ');
readln(num);
if (num < 4 ) then 
begin 
	writeln('O número digitado deve ser maior que 4! ');
end
else
	if (num > 1000 ) then 
	begin 
		writeln('O número digitado deve ser menor que 1000! ');
	end
else
	if ((num mod 2) <> 0 ) then 
	begin 
		writeln('O número digitado deve ser Par! ');
	end;
for i:=2 to (num div 2) do
begin
	num1:= i;
	num2:= num - i;
	if (num1 mod 2 <> 0) and (num2 mod 2 <> 0) then
	begin
		for i:=1 to num1 do                         
		begin
			if (num1 mod i = 0) then
			cont:= cont + 1;
		end;
		if (cont = 2) then
			num3:= num1;

		for i:=1 to num2 do
		begin
			if (num2 mod i = 0) then
				cont2:= cont2 + 1;
			if (cont2 = 2) then
				num4:= num2;
		end;
	
		if (num3 + num4 = num) then
			writeln(num3,'+',num4);
		end;
	end;		               
end.

 

Ali no último for, você colocou o segundo if dentro, mas deveria ficar fora. Assim como está na verificação do num1.

		for i:=1 to num2 do
		begin
			if (num2 mod i = 0) then
				cont2 := cont2 + 1;
		end;
		if (cont2 = 2) then
			num4 := num2;

 

 

Outro ponto que você está utilizando a mesma variável para o 3 for... não poderia, pois os 2 últimos está dentro do primeiro, ou seja: está sobrepondo o controle da variável... no compilador Free Pascal o código nem compila. Deixe o primeiro for com a variável i mesmo e os 2 últimos for com j, em vez de i.

 

Por aí vai...

 

Faça esses 2 ajustes iniciais, depois dê uma revisada para tentar fazer os outros ajustes.

 

PS: por favor, poste logo também o enunciado completo para analisarmos melhor.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Olá, desculpa a demora. Eu fiz os ajustes que você disse, troquei os I's que estavam no For, por j, k. agora o programa n me retorna nem um valor. Desculpe eu escrevi errado aquela hr, queria dizer que ele estava me retornando numeros IMPARES, mas falei PAR. Veja como está agr:

Program Pzim ;
uses
  CRT;
var 
	j, num, num1, num2, num3, num4,
	k, cont, cont2, cont3, i :integer; 

begin
cont:= 0;
cont2:=0;
cont3:=0;
clrscr; 
write('Digite um número par entre [4, 1000]: ');
readln(num);
if (num < 4 ) then 
begin 
	writeln('O número digitado deve ser maior que 4! ');
end
else
	if (num > 1000 ) then 
	begin 
		writeln('O número digitado deve ser menor que 1000! ');
	end
else
	if ((num mod 2) <> 0 ) then 
	begin 
		writeln('O número digitado deve ser Par! ');
	end;
	for i:=2 to (num div 2) do
	begin
		num1:= i;
		num2:= num - i;
		if (num1 mod 2 <> 0) and (num2 mod 2 <> 0) then
		begin
			for j:=1 to num1 do                         
			begin
				if (num1 mod j = 0) then
				cont:= cont + 1;
			end;
			if (cont = 2) then
				num3:= num1;
			for k:=1 to num2 do
			begin
				if (num2 mod k = 0) then
					cont2 := cont2 + 1;
			end;
			if (cont2 = 2) then
				num4 := num2;
			if (num3 + num4 = num) then
				writeln(num3,'+',num4);
		end;
	end;		               
end.

 

adicionado 1 minuto depois

O enunciado é esse aqui: 

 

 

Sem título3.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@FredonVendrusk, o ponto que eu tento sempre levantar é: se atente ao problema, e não a solução.

 

Vamos lá:

  1. O enunciado diz que 1 é primo. Você não o está considerando o que ele diz;
  2. O enunciado diz que a Conjectura de Goldbach é apenas para pares maiores que 4. Aqui você está considerando.

Então... estou pressupondo que 1 não é primo (já faz mais de um século); assim como a Conjectura de Goldbach é para pares acima de 2, e não de 4... Ou seja: OU você considera apenas o enunciado, OU você apenas considera as definições reais. Não é interessante misturar.  (Ou me corrija se estiver engano, é claro.)

 

 

Sobre o código:

  1. Você alinhou o primeiro for como se tivesse dentro do else, mas ele não está! OU corrija a identação, OU corrija o lógica do código;
  2. Você esqueceu de ficar zerando os valores contcont2.
  3. Por aí vai.
adicionado 5 minutos depois

Sobre números primos:

 

 

Obs.: não! Ele não é meu parente (pode até ser. Eu não sei, mas de qualquer forma é afastado, rs)

 

 

 

Sobre a Conjectura de Goldbach (e sobre conjecturas em geral):

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!