15 svar
167 visningar
Moni1 721
Postad: 9 mar 2021 11:59

primtalstvillingar

hej, jag undrar på vad är felet i min kod, eller om jag anroper funktionen på ett icke riktigt metod. 

vi ska hitta primtalstvillingar till och med talet 661. 

function r = primtal(p)
n=p;
for n = 3:2:659
if primtal(p) & primtal(p+2)
disp([p p+2])
end
end

eller behöver vi sätte det här koden i denna koden: som jag gör här

function r = primtal(n)
r = true; % sätter första platsen i 'i' lik true.
for i = 2:floor(sqrt(n)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
if mod(n, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
r = false; % och talet får värdet falsk.
return; % sedan avbryts functionen.
% OM talet är ett primtal utförs aldrig return-satsen utan
% funktionen avslutas när for-loopen kört klart.
% primtal betyder deles med sig självt och noll.
end
for p = 3:2:659

n=p;

if primtal(p) & primtal(p+2)
disp([p p+2])
end
end
end

emilg 478
Postad: 11 mar 2021 09:47

Två tips för att får svar:

1. Använd "Infoga programmeringskod" så att koden blir rätt indenterad och lätt att läsa.

2. Skriv vad som blir fel.

Moni1 721
Postad: 11 mar 2021 11:32

Hej igen, här är koden men när jag anropar funktionen prim(3) till exempel, får jag bara logiskt värde, men jag vill att den ska returnera alla primtal till och med talet 3 

Dr. G 9316
Postad: 11 mar 2021 12:13 Redigerad: 11 mar 2021 12:20

Du har en funktion som undersöker om n är ett primtal. 

över for 3:2:659

så kan du t.ex skriva 

primtal = 2

och sedan efter disp([p p+2]) kan du lägga till 

primtal = [primtal p]

så får du en lista med alla hittade primtal

(Det finns andra sätt att lösa det på.)

EDIT: aha, det funkar inte, då du letar efter primtalstvillingar. Principen funkar dock, men koden får skrivas om. 

emilg 478
Postad: 11 mar 2021 12:13

Använd "Infoga programmeringskod" istället, symbolen i editorn är {;}.

Och indentera koden, det går knappt att läsa...

Moni1 721
Postad: 12 mar 2021 10:58

Hej, igen , jag har nu försökt å skriva om koden men det är fortfarande samma, jag får inte returnerat primtalstvillingar. 

Laguna 28443
Postad: 12 mar 2021 11:12 Redigerad: 12 mar 2021 11:13

Skrivs ingenting ut?

Om du skriver in själva programkoden här, och inte bara en bild, så kan vi provköra. 

Moni1 721
Postad: 12 mar 2021 12:09

function r = prim(n)
t=n;
r = true; % sätter första platsen i 'i' lik true.
for i = 2:floor(sqrt(t)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
if mod(t, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
r = false; % och talet får värdet falsk.
for n = 3:2:659
if prim(n) & prim(n+2)
r = disp([n n+2]);
return; % sedan avbryts functionen.
end
end

%r = [prim n];
% OM talet är ett primtal utförs aldrig return-satsen utan
% funktionen avslutas när for-loopen kört klart.
% primtal betyder deles med sig självt och noll.
end


end

Laguna 28443
Postad: 12 mar 2021 12:26

Jag tror några av dina "end" är på helt fel ställe. Kan du indentera koden så att programflödet framgår? 

Moni1 721
Postad: 12 mar 2021 12:29

hej, jag undrar på vad betyder indentera koden

Moni1 721
Postad: 12 mar 2021 12:33

hej, igen, nu förstår jag 

function r = prim(n)
t=n;
r = true; % sätter första platsen i 'i' lik true.
      for i = 2:floor(sqrt(t)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
           if mod(t, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
r = false; % och talet får värdet falsk.
       for n = 3:2:659
           if prim(n) & prim(n+2)
r = disp([n n+2]);
return; % sedan avbryts functionen.
                                            end
                                    end
                            end
                 end
  end

Moni1 721
Postad: 12 mar 2021 12:42

detta är kod för en den externa funktionen prim. men vi måste definiera den i matlab.

När man definerar en extern funktion placerar man den i en separat m-fil. Filnamnet behöver vara samma som funktionsnamnet.
Funktionen behöver också ofta ligga i samma map som huvudprogrammet för att Matlab ska hitta den.

och jag har sparat den genom att klicka på save as och anget samma namn som på funktionen. 

men när jag nu har skrivit koden för att returnera alla primtalstvillingar till och med talet 661. 

koden är 

n=p;
for p = 3:2:659
if prim(p) & prim(p+2)
r = disp([p p+2]);
end
end

får jag udefinierad variabel p.

emilg 478
Postad: 12 mar 2021 14:15

Bra att du försökte indentera. Det ser dock fortfarande inte bra ut. Men om du använder "Infoga programmeringskod" (ikonen näst längst ut till höger, som jag försökt säga några gånger nu) så kommer det troligen snart vara läsbart.

Moni1 721
Postad: 12 mar 2021 14:27
function r = prim(n)
t=n;
r = true; % sätter första platsen i 'r' lik true.
for i = 2:floor(sqrt(t)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
if mod(t, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
r = false; % och talet får värdet falsk.
for n = 3:2:659
if prim(n) & prim(n+2)
r = disp([n n+2]);
return; % sedan avbryts functionen.
             end
         end
     end 
  end 
end
emilg 478
Postad: 12 mar 2021 14:33 Redigerad: 12 mar 2021 14:34

Bra :)

function r = prim(n)
	t=n;
	r = true; % sätter första platsen i 'r' lik true.
	for i = 2:floor(sqrt(t)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
		if mod(t, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
			r = false; % och talet får värdet falsk.
			for n = 3:2:659
				if prim(n) & prim(n+2)
					r = disp([n n+2]);
					return; % sedan avbryts functionen.
				end
			end
		end 
	end 
end

Är det så här du menar?

Om du skriver en "if" så ska motsvarande end vara på samma nivå. Samma för "for" m.fl.

emilg 478
Postad: 12 mar 2021 14:41
function r = prim(n)
	t=n;
	r = true; % sätter första platsen i 'r' lik true.
	for i = 2:floor(sqrt(t)) % i for-satsen testas ett primtal genom att dela talet med 2,3, osv.
		if mod(t, i) == 0 % om division går jämnt upp för något värde på i, så är talet inte primtal
			r = false; % och talet får värdet falsk.
			return;
			
		end 
	end 
end

for n = 3:2:659
	if prim(n) & prim(n+2)
		%skriv ut (n, n+2)
	end
end

Något sådant istället kanske?

Svara Avbryt
Close