Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Java med Swing, tentaplugg

Hej! Håller på att plugga till en tenta men förstår inte riktigt hur jag ska göra.

Här är uppgiften

Så här har jag börjat men jag vet inte hur jag ska fortsätta eller om jag är på rätt spår.

import java.util.*; import javax.swing.*; public class Primtal { public static boolean isPrime(int n){ for(int i = 0; i < n; i++){ if(n % i == 0) return false; } return true; } public static void main(String[] args){ String input = JOptionPane.showInputDialog("Ge ett jämnt tal > 2"); Scanner sc = new Scanner(input); int intal = sc.nextInt(); } }

Tacksam för all hjälp jag kan få, allt från lösningsförslag till tips på vad jag ska fortsätta med.

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Den här lösningen är inte särskilt effektiv, men lär väl fungera.

Till att börja med måste du någonstans kontrollera att talet är jämnt och större än 2 som kraven var.

Din primtalsfunktion ser nästan färdig ut, men varifrån skall i börja? Har du testat funktionen? Antar att du får fel i så fall (både fel svar och Exception). Tänk på definition av primtal, samt testa att själv räkna något modulo 0 (t.ex. 15 % 0).

För att skriva ut talparen måste du veta alla primtal som är mindre än det inmatade, och hitta vilka som bildar talet. Det lättaste är väl att loopa igenom alla talen som är mindre än det inmatade och checka om det är primtal. Du behöver egentligen inte loopa igenom alla, och bör inte heller göra det för att undvika att samma talpar dyker upp två gånger i olika ordning. Hittar du ett primtal kan du räkna ut vilket det andra talet i paret skulle vara, och kontrollera i fall det också är ett primtal.

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

Vet ej om det är den bästa lössningen men detta är min tanke kring frågan

Du ska skapa en summa av primtal för komma till talet som skrivs in? (talet måste vara jämnt och större än 2). Om jag inte miss minner mig helt så är alla jämna tal defilerat som att de ska vara delbart med 2. Vilket betyder direkt att vi kan säga alla jämna tal större än 2 är INTE ett prim tal (Så vi behöver inte kolla om det är primtal bara om det är jämnt).

(jag kommer inte ihåg java syntax för detta så jag skrev c++/c):

if (x > 2 && x%2==0){ //hitta summa. } else{ //användaren uppfyllde inte kraven }

Sedan vill vi ju hitta alla primtal som är mindre än siffran som användaren skrev in, alternativ är vi har en list med MÅNGA primtal (sök igenom listan hitta primtal som är mindre än input vi ska kanske inte låt oss säga få 2 som första siffra när talet som användaren skriver in är 1 000 000). Det finns ett antal primtals algoritmer som kan hitta detta (hade rekommenderat denna, då den är ganska lätt förstod (denna algoritm hittar alla primtal mindre än N)).

När du då har denna lista med primtal mindre än siffran som användaren skrev in gäller det bara att testa summer två av dem så passar ihop för att bilda siffran som användaren skriv in.

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Aug 2007

Struntar lite i syntax här men något sånt här om du inte bryr dig om tiden det tar

if (x > 2 && x%2==0){ for(i = x; i > 0; i--){ // Div med 2 för att inte få med dubbletter. if(isPrime(i) && isPrime(x-i)){ // Använd } } } else{ // Använd ej } isPrime(x) for(int i = 2; i < n; i++){ if(n % i == 0) return false; } return true;

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

I c++98 (utan gui):

#include <iostream> #include <vector> #include <cmath> int main(){ int num; std::cout << "Please enter a even number > 2:"<< std::endl; std::cin >> num; std::cout << std::endl; std::vector<int> primeList(2,0); if(num>2 && num%2==0){ for(int i = 2; i <= num; i++){ primeList.push_back(i); } for(int i = 2; i <= sqrt(num); i++){ if(primeList[i] != 0){ int times=1; for(int j = i*i; j <= num; j=j+times*i){ primeList[j] = 0; if (j>i*i) times++; } } } for(std::vector<int>::iterator it = primeList.begin(); it != primeList.end(); it++){ if((*it) != 0){ int tmp = num-(*it); if(primeList[tmp] != 0){ std::cout << primeList[tmp] << "+" << (*it) << std::endl; } } } } else{ std::cout << "Please Try again!" << std::endl; } return 0; }

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6