Permalänk
Medlem

Primtal och java

Japp, denna fråga har ställts förut, men ändå inte.
Jag försöker lära mig java och ska skriva ett program där användaren skriver in ett tal, programmet ska då tala om huruvida det angivna talet är ett primtal eller inte.

Hur enkelt som helst tänkte jag. Tills....

import java.util.Scanner; public class primtal { public static void main(String[] args){ Scanner number = new Scanner(System.in); int num; System.out.println("Ange ett positivt heltal: "); num = number.nextInt(); if( num <= 0 ){ System.out.print("Talet måste vara större än 0"); break; }else if (num % 2 == num || num % 3 == num || num % 5 == num || num % 7 == num);{ System.out.print("Talet är INTE ett primtal"); break; }else{ //Syntax error on token "else", delete this token System.out.print("Talet ÄR ett primtal"); } } }

Varför får jag error på min else-sats?

Tack för hjälpen
(Det här är EN av de lösningar jag tänkte på)

Redigerat in [code]-taggar
Permalänk

@JJ72:
break behövs inte innuti if-else satser, och så har du en semikolon efter en av dina if satser, som inte ska vara där heller.

Permalänk

Kan inte java, men har du inte ett simikolon för mycket i else if satsen? dvs innan {

Permalänk
Medlem

Som IceColdGlass sade är där ett semikolon på den långa if-satsraden vilket troligvis är boven.

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Medlem

Tack så jättemycket för hjälpen
Break la jag in för att någon påpekade att det skulle vara där, när det bara var det lilla semikolonet som skulle bort.
Sen hade jag råkat snurra till vad som är och INTE är primtal.

Så här ser det ut nu:

import java.util.Scanner; public class primt { public static void main(String[] args){ Scanner number = new Scanner(System.in); int num; System.out.println("Ange ett positivt heltal: "); num = number.nextInt(); if( num <= 0 ){ System.out.print("Talet måste vara större än 0"); }else if (num % 2 == num || num % 3 == num || num % 5 == num || num % 7 == num){ System.out.print("Talet ÄR ett primtal"); }else{ System.out.print("Talet är INTE primtal"); } } }

Någon som har andra förslag?
Man kanske ska lägga till att man får ange ett nytt nummer om man matar in ett tecken <=0 eller annat än ett int....?

Hur får jag koden att se "rätt" ut här i forumet?

Permalänk
Medlem

Nääää

Varför får jag svaret att 4 och 6 är primtal?

Permalänk
Medlem

Du har nog missförstått hur modolus (%) fungerar.

4%5 blir 4 delat med 5, och sedan returnerar den resten.
4 är ej delbart med 5, så resten blir 4, eller "num".

Permalänk
Medlem

Det är ju förstås sant....
Förslag på lösning? Att bara ändra till / duger ju inte....

Permalänk
Inaktiv
Skrivet av JJ72:

Nääää

Varför får jag svaret att 4 är ett primtal?

Du borde inte hårdkoda talen du kollar med, tänk om talet är större än något av talen du försöker dela med.

Du kollar inte heller om resten blir noll, vilket är essensen av att talet inte är ett primtal. Poängen med primtal
är att de inte är jämnt delbara med något tal förutom sig själva och 1

Istället borde du köra något i stil med (går givetvis att göra mycket snabbare):

public bool isPrime(int prime){ for(int i = prime - 1; i > 1; i--){ if((prime % i == 0){ return false; } } return true; }

Tror jag tänkte rätt iaf, är precis på väg från jobbet!

Permalänk
Medlem

Haha. Trevlig helg då

Jag tänkte bara att om talen är delbara med 2, 3, 5 eller 7 så är de inte primtal.... men så enkelt är det ju inte nu när jag tänker efter...

Permalänk
Legendarisk
Skrivet av JJ72:

Hur får jag koden att se "rätt" ut här i forumet?

Omge den med [code]...[/code]-taggar.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

Tack Biberu

Permalänk
Medlem
Skrivet av anon81912:

Du borde inte hårdkoda talen du kollar med, tänk om talet är större än något av talen du försöker dela med.

Du kollar inte heller om resten blir noll, vilket är essensen av att talet inte är ett primtal. Poängen med primtal
är att de inte är jämnt delbara med något tal förutom sig själva och 1

Istället borde du köra något i stil med (går givetvis att göra mycket snabbare):

public bool isPrime(int prime){ for(int i = prime - 1; i > 1; i--){ if((prime % i == 0){ return false; } } return true; }

Tror jag tänkte rätt iaf, är precis på väg från jobbet!

Någon som vill förklara detta för mig? Är det tänkt att jag ska göra en konstuktor med main i?
Som sagt, jag har nog gått vilse någonstans

Permalänk
Medlem
Skrivet av JJ72:

Någon som vill förklara detta för mig? Är det tänkt att jag ska göra en konstuktor med main i?
Som sagt, jag har nog gått vilse någonstans

Det som han försöker illustrera är for-loopen.
Teorien bakom den är att ett primtal bara är jämtdelbart (dvs utan rest) med sig själv och 1.
Det for-loopen för är att gå igenom alla tal mellan 2 och talet och kolla om det är jämnt delbart (tal1 % tal2 ger resten vid tal1/tal2, dvs noll om jämnt delbart)

Det går som han skriver att göra det mycket snabbare, men exemplet är mycket bra illustration av en naiv implementation av primtals kontroll.

Permalänk
Skrivet av JJ72:

Någon som vill förklara detta för mig? Är det tänkt att jag ska göra en konstuktor med main i?
Som sagt, jag har nog gått vilse någonstans

så här hade jag gjort: i din main har du ett anrop till hans isPrime där du hanterar dina utskrifter. typ if (!isPrime) "inte prim"; osv

sen under din main drar du in hans kod bara, fast kanske som en private istället.

så:

class{
main{ några if(isPrime) satser }

private bool isPrime(int.......{

}
}

Hoppas du förstår min pseudo kod

Permalänk
Medlem

Tackar så väldigt.

Det som förvillar mig lite är första raden:
[code]public bool isPrime(int prime){
[\code]

Permalänk
Medlem
Skrivet av JJ72:

Någon som vill förklara detta för mig? Är det tänkt att jag ska göra en konstuktor med main i?
Som sagt, jag har nog gått vilse någonstans

Innan du skriver kod, se till att du har koll på problemet (dvs vad koden skall göra). Antag att du har talet x, hur undersöker du om x är ett primtal?

Det allra enklaste testet är att prova att dividera x med respektive heltal mellan 2 och x-1 och se om resten vid någon av divisionerna blir 0...inte speciellt effektivt, men det är ett fungerande sätt.

Dold text
Permalänk
Medlem

Det du kan göra är att kolla om talet n är delbart med något av talen 2 t.om sqrt(n), hittar du ingen matchning bör det då vara ett primtal. Detta för att andra tal är uppbyggda av primtalsfaktorer som du hittar <= sqrt(n)

Tex 12 = 2*2*3 , 75 = 5*5*3
sqrt(9) = 3
9 = 3*3
så i psuedo-kod:

isPrime(n):

for(i; i<=sqrt(n); i++){
if n%i == 0 return false
}
return true

Glöm inte bort att kolla edge-cases också

Permalänk

import java.util.Scanner; public class primt { public static void main(String[] args){ Scanner number = new Scanner(System.in); int num; System.out.println("Ange ett positivt heltal: "); num = number.nextInt(); if( num <= 0 ){ System.out.print("Talet måste vara större än 0"); //här anropas private klassen isPrime }else if (isPrime(num){ //här returnerade isPrime(num) true System.out.print("Talet ÄR ett primtal"); }else{ //här returnerade isPrime(num) false System.out.print("Talet är INTE primtal"); } } //Dena koden körs när du gör anropet isPrime private bool isPrime(int num){ //JJ72s Enkla lösning for(int i = prime - 1; i > 1; i--){ if((prime % i == 0){ return false; } } return true; /* //NoToes sexiga lösning //Tänk på edge cases! altså som fallet 0 som redan hanteras i main for(i; i<=sqrt(n); i++){ if n%i == 0 return false } return true */ } }

Inte testkört detta, säkert fel nånstans

Permalänk
Medlem

Har inte tillgång till något program atm så kan inte testköra.

public class Main{ public bool isPrime(int n){ if(n == 2) return true; for(int i = 2; i<=sqrt(n); i++){ if (n%i == 0) return false; } return true; } public static void main(String[] args){ int tal[] = new int[] {1,3,54,56,343,757,33}; for(int i= 0; i<tal.length();i++){ if(isPrime(tal[i])){ System.out.println(tal[i] + " is a prime number"); } else{ System.out.println(tal[i] + " is NOT a prime number"); } } } }

Finns antagligen lite fel nånstans
Edge cases kan du lägga in själv

Permalänk
Medlem

Tack så galet mycket.
Nu har jag lite att jobba med... Jag får hela tiden fel på bool eller else if- satserna....

Uppskattar verkligen all hjälp

Permalänk
Medlem

Nåt sånt här?

import java.util.Scanner; class primTal { public static void main(String args[]) { int temp; boolean isPrime=true; Scanner scan= new Scanner(System.in); System.out.println("Enter a number for check:"); int num=scan.nextInt(); for(int i=2;i<=num/2;i++) { temp=num%i; if(temp==0) { isPrime=false; break; } } if(isPrime) System.out.println(num + " is Prime Number"); else System.out.println(num + " is not Prime Number"); } }

Som sagt. Otroligt tacksam för all er hjälp

Permalänk
Medlem

@JJ72:
Ger lite förslag och motiveringar på hur jag hade ändrat den, bara lite tips.

import java.util.Scanner; class primTal { /*Separat metod isPrime för att kolla om det är ett primtal Motivering: Låt en metod ansvara för en sak, samtidigt kan du senare använda metoden från andra klasser*/ public static void main(String args[]) { int temp; boolean isPrime=true; Scanner scan= new Scanner(System.in); System.out.println("Enter a number for check:"); int num=scan.nextInt(); /*Fundera på vad skillnaden innebär att kolla upp till num/2 eller Math.sqrt(num) vid stora tal. Ex om n = 65213 så blir det ca 32606 iterationer vid (n/2) jämfört med ca 256 vid(sqrt(n))*/ for(int i=2;i<=num/2;i++) { temp=num%i; // Du kan kolla direkt i if-satsen under if(num%i == 0) if(temp==0) { isPrime=false; break; // Har du isPrime som metod behöver du inte break då du returnerar false istället } } if(isPrime) System.out.println(num + " is Prime Number"); else System.out.println(num + " is not Prime Number"); } }

Ett exempel med scanner input

import java.util.Scanner; class PrimTal{ /*Mer modulärt*/ public bool isPrime(int n){ if(n == 2) return true; for(int i = 2; i<=sqrt(n); i++){ if (n%i == 0) return false; } return true; } public static void main(String[] args){ Scanner scan= new Scanner(System.in); System.out.println("Enter a number for check:"); int num=scan.nextInt(); if(isPrime(num){ System.out.println(num + " is a prime number"); } else{ System.out.println(num + " is not a prime number"); } Glass piggelin = new Glass(8); System.out.println("Price of piggelin is now: " + piggelin.getPrice()); } } class Glass{ private int price; private PrimTal p; public Glass(int price){ p = new PrimTal(); // Vilseledande klassnamn price = generatePrice(price); } public int generatePrice(int checkNum){ /*Set price to prime > checkNum*/ int tmpPrice = checkNum; while(!p.isPrime(tmpPrice)){ tmpPrice = tmpPrice +1; } return tmpPrice; } public int getPrice(){ return this.price; }

Bara ett litet exempel på hur du skulle kunna använda metoden, reservation för fel i koden har ej kompilerat & provkört.

Permalänk
Medlem

Ett nästa steg du kan ta, när du fått grunden på plats, är att kika på algoritmer som t ex Rabin-Miller så får du lite teori i bakgrunden också. Nu vet jag inte hur stora tal du tänkt jobba med, men det blir en del klydd ska du se. Dock nyttigt!

Visa signatur

RTS :D

Permalänk
Medlem

Tack ska ni ha

Tanken med mitt java-lärande är väl först och främst att lära mig grunderna, att kunna förstå hur och varför.

Jag hittar övningar på nätet från olika kurser, och tycker det fungerar ok som en hint om vad jag borde lära mig och kunna. Nästa "övning" jag hittat (den kom efter den här med algoritmer) är för mig riktigt knepig, men men. Det är väl bara att hugga i

Permalänk
Medlem

Något förslag hur jag skulle kunna använda modulatorn i detta exempel?

Permalänk
Inaktiv
Skrivet av JJ72:

Något förslag hur jag skulle kunna använda modulatorn i detta exempel?

Är talet jämnt delbart blir det rest. Är det ingen rest är talet inte jämnt delbart. Tal som är jämnt delbara är primtal.

Ett tal är ett primtal om primtat % (alla andra lägre tal förutom 1) == 0.

Permalänk
Medlem

Japp. Det är väl det "som blir kvar"?

10/3 = 3, och 1 på modulus.

Jag läste i frågan jag tog uppgiften ifrån: "Tips:
använd modulus-operatorn %. "

Det var därför jag tog upp det

Permalänk
Inaktiv
Skrivet av JJ72:

Japp. Det är väl det "som blir kvar"?

10/3 = 3, och 1 på modulus.

Jag läste i frågan jag tog uppgiften ifrån: "Tips:
använd modulus-operatorn %. "

Det var därför jag tog upp det

Ja, det är en jättebra operator för att kolla om ett tal är primtal.

Permalänk
Medlem
Skrivet av anon81912:

Är talet jämnt delbart blir det rest. Är det ingen rest är talet inte jämnt delbart. Tal som är jämnt delbara är primtal.

Ett tal är ett primtal om primtat % (alla andra lägre tal förutom 1) == 0.

Ingen rest vid delning <--> Jämnt delbart.

Ett tal N är ett primtal om N mod n =/= 0 för alla n 2.. sqrt(N).